我試圖找到大斐波那契數字的最后一位,我的腳本可以計算它們并快速找到最后一位,但是當我嘗試從 1000 計算數字時,我得到 RecursionError。
這是我的腳本:
cache = {}
def last_digit_of_fibonacci_number(n):
assert 0 <= n <= 10 ** 7
if n in cache:
return cache[n]
if n == 1 or n == 2:
return 1
elif n == 0:
return 0
else:
result = (last_digit_of_fibonacci_number(n - 1) last_digit_of_fibonacci_number(n - 2)) % 10
cache[n] = result
return result
關于如何在不使用 setrecursionlimit() 重置遞回限制的情況下解決我的問題的任何想法?
uj5u.com熱心網友回復:
請注意,由于您只對每個斐波那契數的最后一位感興趣,因此結果序列是回圈的:只要有兩個后續結果等于兩個先前的后續結果,值就會重復。
例如,1 和 2 的結果都是 1,所以只要后面兩個后面的回傳值也都是 1,我們就有了一個回圈。讓我們找到這些回圈:
last_digit_of_fibonacci_number(250)
for n in range(3, 250):
if cache[n] == cache[n 1] == 1:
print(n)
61
121
181
241
所以這個回圈的長度是 60,你可以改變你的函式來利用這個事實:
cache = {}
def last_digit_of_fibonacci_number(n):
assert 0 <= n <= 10 ** 7
if n in cache:
return cache[n]
if n == 1 or n == 2:
return 1
if n == 0:
return 0
if n > 61:
n = n % 60
result = (last_digit_of_fibonacci_number(n - 1)
last_digit_of_fibonacci_number(n - 2)) % 10
cache[n] = result
return result
由于回圈長度小于遞回限制,這將避免任何遞回深度問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407584.html
標籤:
