在做遞歸的時候會產生很多的冗餘計算,需要用暫存(將一些計算結果暫時記入到內存,當使用的時候直接調用)的方法進行優化
最優子結構
一、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
"""
從結果看:該方法顯然將指數時間複雜度做了很大提升。這也是