斐波那契數列理解動態規劃問題[python]

動態規劃
    |-定義:將原問題拆解成若干子問題,同時保存子問題的答案,使得每個子問題只求解一次,最終獲得原問題的答案
    |-解決的問題:
        遞歸問題->重疊子問題   -> 記憶化搜索(自頂向下的解決問題)

                                             -> 動態規劃(自底向上的解決問題)

# 遞歸的的斐波那契數列解決方法 時間複雜度O(2^n)
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n-1) + fib(n-2)
# print(fib(50))

# 動態規劃 先解決小數據量的 再層層遞推的解決大數據量級的問題 時間複雜度O(n)
def fib2(n):
    memo = [-1 for x in range(n+1)]
    memo[0] = 0
    memo[1] = 1
    for i in range(2, n+1):
        memo[i] = memo[i-1]+memo[i-2]
    return memo[n]
# print(fib2(50))

# 記憶化搜索
MAXSIZE = 1000
memo = [-1 for i in range(MAXSIZE)]
def fib3(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    if memo[n] == -1:
        memo[n] = fib3(n-1) + fib3(n-2)
    return memo[n]
print(fib3(40))
可見 動態規劃和記憶化搜索的思路是比較接近的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章