python使用LRU缓存算法,利用带缓存的动态规划法求解斐波那契数列

参考链接: @functools.lru_cache(user_function)
在这里插入图片描述
代码展示:

# 对比递归法求解斐波那契数列,
# 法一: 朴素递归法
import time, functools
def fibo_vanilla(n):
    if n < 2:
        return n
    else:
        return fibo_vanilla(n-1) + fibo_vanilla(n-2)

print("\n以下是法一,(朴素递归法):")
n = int(input("请输入斐波那契数的序号:"))
start = time.time()
result = fibo_vanilla(n)
end = time.time()
print(result,'程序(朴素递归法)运行时间:',end-start)

# 如果 maxsize 设为 None, LRU 特性将被禁用且缓存可无限增长。
@functools.lru_cache(maxsize=None)  
def fibo_dynamicProgrammingWith_LRU_Cache(n):
    if n < 2:
        return n
    else:
        return fibo_dynamicProgrammingWith_LRU_Cache(n-1) \
            + fibo_dynamicProgrammingWith_LRU_Cache(n-2)

print("\n\n\n以下是法二,(带缓存的动态规范法):")
n = int(input("请输入斐波那契数的序号:"))
start = time.time()
result = fibo_dynamicProgrammingWith_LRU_Cache(n)
end = time.time()
print(result,'程序(带缓存的动态规范法)运行时间:', end-start)
print(fibo_dynamicProgrammingWith_LRU_Cache.cache_info())

运行结果展示:
在这里插入图片描述

法三(数学解析法):
在这里插入图片描述

# 求解斐波那契数列;
# 利用关系式: F(n) = F(n-1) + F(n-2), 其中n>=2
# 恒等变换: F(n) + alpha*F(n-1) = beta{F(n-1) + alpha*F(n-2)}
# 待定系数法,列写方程: 
#   beta-alpha = 1, alpha*beta = 1;
#   求解方程组得两组解
#   alpha1 = (-1.0+pow(5.0,0.5))/2.0, beta1 = (1.0+pow(5.0,0.5))/2.0
#   alpha2 = (-1.0-pow(5.0,0.5))/2.0, beta2 = (1.0-pow(5.0,0.5))/2.0
#   代入方程: F(n) + alpha*F(n) = beta{F(n-1) + alpha*F(n-2)} 得:
#   F(n) + alpha1*F(n-1) = beta1**(n-1)
#   F(n) + alpha2*F(n-1) = beta2**(n-1)
#   两者联立可解出: 
#           F(n) = (alpha2*(beta1**(n-1))-(alpha1*(beta2**(n-1))))/(alpha2-alpha1)
#           其中: n>=1,经验证n=0时该公式仍旧成立,故该公式成立条件为:n>=0;

import sys
def fibonacci(n):
    alpha1 = (-1.0+pow(5.0,0.5))/2.0
    beta1 = (1.0+pow(5.0,0.5))/2.0
    alpha2 = (-1.0-pow(5.0,0.5))/2.0
    beta2 = (1.0-pow(5.0,0.5))/2.0
    return int((alpha2*(beta1**(n-1))-(alpha1*(beta2**(n-1))))/(alpha2-alpha1))
for line in sys.stdin:
    n = int(line.strip())
    print(fibonacci(n))

运行结果展示:
在这里插入图片描述

动态规划方法:

import sys
def fibonacci(n):
    if n < 2:
        return n
    else:
        a, b = 0, 1
        for i in range(n-1):
            a, b = b, a + b
        return b

for line in sys.stdin:
    n = int(line.strip())
    print(fibonacci(n))

运行结果展示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值