Python 斐波那契数列 三种函数写法比较(递归函数的示例)

Python 斐波那契数列 三种函数写法比较

  • 1、斐波那契数列 函数写法
  • 2、上例总结
  • 3、递归总结

1、斐波那契数列 函数写法

import datetime

def fib1(n=35):
    a = 0
    b = 1
    for i in range(n-1):
        a, b = b, a + b
    return b

def fib2(n=35):
    return 1 if n<3 else fib2(n-1) + fib2(n-2)

def fib3(n=35, a=0, b=1):
    a, b = b, a + b
    if n == 1:
        return a
    return fib3(n-1, a, b)

fns = [fib1, fib2, fib3]
# fns = [fib1, fib3]

for fn in fns:
    start = datetime.datetime.now()
    for i in range(100):
        fn()
    delta = (datetime.datetime.now() - start).total_seconds()
    print(fn, delta)
<function fib1 at 0x0000000004F844C8> 0.0
<function fib2 at 0x0000000004F84A68> 182.069
<function fib3 at 0x0000000004FA1288> 0.001

2、上例总结

  • 递归函数效率很低,因为重复计算了很多值
  • 利用递归函数上次计算的值,计算效率有了很大提高
  • 交换计算,效率最高

3、递归总结

  • 递归是一种很自然的表达,符合逻辑思维
  • 递归相对运行效率低,每一次调用函数都要开辟栈帧
  • 递归一定要有退出条件,递归调用一定要执行到这个退出条件,如果没有退出条件的递归调用,就是无限调用
  • 递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了
  • 如果有限次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂一些,但是只要不是死循环,可以多次迭代直至算出结果
  • 绝大多数递归,都可以使用循环实现
  • 即使递归代码很简洁,但是能不用则不用递归

你可能感兴趣的:(Python,python)