Anrs Hu

你所知的一切…

无聊 — 比较下线性递归和尾递归、函数调用和 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

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

Subscribe to comments with RSS or TrackBack to '无聊 — 比较下线性递归和尾递归、函数调用和 lambda 演算'.

  1. Tail recursion is efficient because no stack frames are needed, it’s simply treated like a “for/while loop”, but it’s harder to read. Basically, you trade readability for performance, which is hard to take the decision. :)

    Seth

    20 Aug 09 at 8:46 pm

  2. @seth
    还好吧,我觉得可读性还是蛮高的,当然和线性递归比起来是差着一大截…

    admin

    21 Aug 09 at 2:24 am

  3. 你最近博瘾来了哇

    hkbarton

    21 Aug 09 at 9:51 am

  4. 楼上是虎逼青年,其实我是想写淘淘淘淘,华丽丽的桃…而且你说的博瘾怎么听怎么邪恶…

    admin

    21 Aug 09 at 5:17 pm

Leave a Reply