MIT_計算機科學與程序:動態規劃,重疊的子問題

在做遞歸的時候會產生很多的冗餘計算,需要用暫存(將一些計算結果暫時記入到內存,當使用的時候直接調用)的方法進行優化
最優子結構

一、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
"""

從結果看:該方法顯然將指數時間複雜度做了很大提升。這也是

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章