@cache

文章探讨了使用递归算法计算斐波那契数列的实现,对比了常规递归与使用@cache装饰器进行缓存的方法,展示了后者显著提高了计算速度,尤其是在处理大数值时.
摘要由CSDN通过智能技术生成
import time

def feibo_recur(n):
    if n < 0:
        return "n小于0无意义"
    # n为0或1时返回1(前两个数为1)
    if n == 0 or n == 1:
        return 1
    # 根据斐波那契数列的定义,其他情况递归返回前两个数之和
    return feibo_recur(n-1) + feibo_recur(n-2)

for i in [10, 20, 30, 40, 41, 42, 43]:
    start = time.time()
    print(f'第{i}个斐波那契数:', feibo_recur(i))
    end = time.time()
    print(f'n={i} Cost Time: ', end - start)

第10个斐波那契数: 89
n=10 Cost Time:  0.001020193099975586
第20个斐波那契数: 10946
n=20 Cost Time:  0.0019788742065429688
第30个斐波那契数: 1346269
n=30 Cost Time:  0.24593138694763184
第40个斐波那契数: 165580141
n=40 Cost Time:  28.18946075439453
第41个斐波那契数: 267914296
n=41 Cost Time:  44.36133360862732
第42个斐波那契数: 433494437
n=42 Cost Time:  71.80296754837036
第43个斐波那契数: 701408733
n=43 Cost Time:  116.39404129981995
import time

temp = {}  # 创建一个空字典,用来记录第i个斐波那契数列的值
def feibo_recur_temp(n):
    if n < 0:
        return "n小于0无意义"
    # n为0或1时返回1(前两个数为1)
    if n == 0 or n == 1:
        return 1
    if n in temp:  # 如果temp字典中有n,则直接返回值,不调用递归代码
        return temp[n]
    else:
        # 如果字典中还没有第n个斐波那契数,则递归计算并保存到字典中
        temp[n] = feibo_recur_temp(n-1) + feibo_recur_temp(n-2)
        return temp[n]

for i in [10, 20, 30, 40, 41, 42, 43]:
    start = time.time()
    print(f'第{i}个斐波那契数:', feibo_recur_temp(i))
    end = time.time()
    print(f'n={i} Cost Time: ', end - start)
print(temp)
第10个斐波那契数: 89
n=10 Cost Time:  0.0
第20个斐波那契数: 10946
n=20 Cost Time:  0.0
第30个斐波那契数: 1346269
n=30 Cost Time:  0.0
第40个斐波那契数: 165580141
n=40 Cost Time:  0.0
第41个斐波那契数: 267914296
n=41 Cost Time:  0.0
第42个斐波那契数: 433494437
n=42 Cost Time:  0.0
第43个斐波那契数: 701408733
n=43 Cost Time:  0.0
{2: 2, 3: 3, 4: 5, 5: 8, 6: 13, 7: 21, 8: 34, 9: 55, 10: 89, \
11: 144, 12: 233, 13: 377, 14: 610, 15: 987, 16: 1597, 17: 2584, 18: 4181, 19: 6765, \
20: 10946, 21: 17711, 22: 28657, 23: 46368, 24: 75025, 25: 121393, 26: 196418, \
27: 317811, 28: 514229, 29: 832040, 30: 1346269, 31: 2178309, 32: 3524578,\
 33: 5702887, 34: 9227465, 35: 14930352, 36: 24157817, 37: 39088169,\
 38: 63245986, 39: 102334155, 40: 165580141, 41: 267914296, \
42: 433494437, 43: 701408733}

被@cache注释过的函数,每当传入相同的参数时,如果曾经计算过这个参数,可以从结果直接返回。而不需要重复计算,@cache可以把函数计算过的不同参数的结果保存下来。

from functools import cache
import time
@cache
def feibo_recur(n):
    if n < 0:
        return "n小于0无意义"
    if n == 0 or n == 1:
        return 1
    return feibo_recur(n-1) + feibo_recur(n-2)

for i in [10, 20, 30, 40, 41, 42, 43]:
    start = time.time()
    print(f'第{i}个斐波那契数:', feibo_recur(i))
    end = time.time()
    print(f'n={i} Cost Time: ', end - start)

第10个斐波那契数: 89
n=10 Cost Time:  0.0
第20个斐波那契数: 10946
n=20 Cost Time:  0.0
第30个斐波那契数: 1346269
n=30 Cost Time:  0.0
第40个斐波那契数: 165580141
n=40 Cost Time:  0.0
第41个斐波那契数: 267914296
n=41 Cost Time:  0.0
第42个斐波那契数: 433494437
n=42 Cost Time:  0.0
第43个斐波那契数: 701408733
n=43 Cost Time:  0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值