参考链接: @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))
运行结果展示: