簡體   English   中英

Python遞歸斐波那契函數無法處理大值

[英]Python recursive fibonacci function doesn't process large values

我編寫了一個簡單的遞歸斐波那契函數:

def recursive_fibonacci(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    if n > 1:
        return recursive_fibonacci(n-1) + recursive_fibonacci(n-2)

並嘗試在其中發揮較大的價值:

print(recursive_fibonacci(100))

控制台什么都沒掉,我的Mac上的風扇開始劇烈旋轉

有人可以解釋發生了什么。 堆棧框架內部發生了什么?

用參數N調用例程的總次數為phi^N次。 對於N = 100,這大約是10 ^ 20次調用。 不要等待N = 100的輸出; 你不會活那么久。

但是,您可以記住該功能。 查找術語; 還有一個Python軟件包可以自動為您完成此操作。 這個想法是存儲每個值調用的結果。 對於任何N ,您只計算一次f(N) 之后,您只需在表中查找值。

在Prune的一個很好的答案的基礎上,您可以輕松地記住函數調用,從而通過在函數定義中傳遞一個可變參數(一個dict)並將已計算的值存儲在dict中,每個n值僅被計算一次:

def recursive_fibonacci(n, mem={}):
    if n == 0 or n == 1:
        return n
    else:
        if n-1 not in mem:
            mem[n-1] = recursive_fibonacci(n-1)
        if n-2 not in mem:
            mem[n-2] = recursive_fibonacci(n-2)
        return mem[n-1] + mem[n-2]


print(recursive_fibonacci(100))
# 354224848179261915075

已經計算出的值已經在字典中查詢了,不需要進一步的遞歸調用。

基本的遞歸解決方案需要很多時間。 這樣做的原因是,對於每個計算出的數字,它需要多次計算所有先前的數字。 看下面的圖片。

代表斐波那契計算的樹

它代表使用您的函數計算Fibonacci(5)。 如您所見,它計算Fibonacci(2)的值是3倍,而Fibonacci(1)的值是5倍。 您要計算的數字越高,情況就越糟。

更糟糕的是,對於列表中計算出的每個斐波那契數,您不會使用以前知道的數字來加快計算速度,而是“從頭開始”計算每個數。 最簡單的方法是只創建一個斐波納契數字列表,直到您想要的數字為止。 如果這樣做,您可以說是“從下而上”構建的,可以重復使用前一個數字來創建下一個。 如果您有斐波那契數字[0,1,1,2,2,3]的列表,則可以使用該列表中的最后兩個數字來創建下一個數字,並返回列表的最后一個數字,這是您的最終答案。

def fib_to(n):
    fibs = [0, 1]
    for i in range(2, n+1):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs[-1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM