在做递归的时候会产生很多的冗余计算,需要用暂存(将一些计算结果暂时记入到内存,当使用的时候直接调用)的方法进行优化
最优子结构
一、fib的快速方法
def fib(n):
global numbcalls_fib
numbcalls_fib += 1
if n <= 1:
return 1
return fib(n-1) + fib(n -2)
def fastfib(n, memo):
global numbcalls
numbcalls += 1
if n not in memo: # 减少了重叠部分的计算
memo[n] = fastfib(n-1, memo) + fastfib(n-2, memo)
return memo[n]
def fib1(n):
memo = {0:1, 1:1}
return fastfib(n, memo)
def fib_compare(n):
print("{}th fib is {}(fib func)/{}(fast_fib func)".format(n, fib(n), fib1(n)))
print("Compare Two fib function loop times:\nfib:{}, fastfib:{}".format(numbcalls_fib, numbcalls))
numbcalls, numbcalls_fib = 0, 0
fib_compare(10)
"""
10th fib is 89(fib func)/89(fast_fib func)
Compare Two fib function loop times:
fib:177, fastfib:19
"""
从结果看:该方法显然将指数时间复杂度做了很大提升。这也是