Anrs Hu

你所知的一切…

Archive for the ‘递归’ tag

无聊 — 比较下线性递归和尾递归、函数调用和 lambda 演算

with 4 comments

不多话,直接上图上真相…

代码:

  1. #!/usr/local/bin/python2.6
  2. #coding=utf-8
  3.  
  4.  
  5. fib1 = lambda n: 1 if n < 3 else fib1(n – 2) + fib1(n – 1)
  6.  
  7. def fib2(n):
  8.     if n < 3:
  9.         return 1
  10.     return fib2(n – 2) + fib2(n – 1)
  11.  
  12. def fib3(n):
  13.     f = (lambda i, first, second:
  14.              second if i >= n else f(i + 1, second, first + second))
  15.     return f(1, 0, 1)
  16.  
  17. def fib4(n):
  18.     def _fib4(i, first, second):
  19.         if i >= n:
  20.             return second
  21.         return _fib4(i + 1, second, first + second)
  22.     return _fib4(1, 0, 1)
  23.  
  24.  
  25. if __name__ == ‘__main__’:
  26.     for i in range(1, 41):
  27.         print fib1(i)
  28.         print fib2(i)
  29.         print fib3(i)
  30.         print fib4(i)
  31.  

结论:
screenshot_049

1. fib1/fib2 的 40 次调用累计 5 亿次以上的递归,总耗时 653 秒多;fib3 的 lambda 和 _fib4 的 40 次调用累计 820 次递归,总耗时不到 0.1 秒

2. 函数调用与 lambda 演算区别不大,5 亿次以上的递归调用,差异仍然保持在 20 秒内

3. 能用尾递的还用线递,都是虎逼青年…

Written by admin

August 20th, 2009 at 7:56 pm

Posted in Coding

Tagged with