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

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

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、递归总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值