我一直在嘗試解決一個問題(我是遞回的新手),這是給定的代碼:
def f(n):
print(n)
if (0 <= n) and (n <= 1000000000):
f(n-2)
f(n 5)
f(n 7)
我需要計算呼叫 f(0) 時列印的唯一數字。首先,我嘗試將每個唯一編號附加到串列中,而不是列印所有編號。但是發生了“RecursionError:在比較中超出了最大遞回深度”。然后我更改了 sys.setrecursionlimit 的值,我的代碼開始作業但什么也沒列印:
import sys
sys.setrecursionlimit(2000000000)
lst = []
def f(n):
if n not in lst:
lst.append(n)
if (0 <= n) and (n <= 1000000000):
f(n-2)
f(n 5)
f(n 7)
f(0)
print(len(lst))
我應該怎么做才能解決問題?
uj5u.com熱心網友回復:
無論遞回深度如何,代碼看起來都會崩潰,因為呼叫次數隨著迭代呈指數增長。(其中一些不會導致進一步的呼叫,例如f(n-2)在第一次迭代時,但大多數會)。這意味著經過幾十次迭代后,解釋器可能已經有數十億次呼叫需要跟蹤。
對我來說,它看起來更像是一個可以用紙筆解決的數學難題。運行代碼似乎不可行。
uj5u.com熱心網友回復:
這個問題絕對不是測驗你有沒有超級計算機。答案是 10^9 10。
這是因為從 0 到 10^9 的所有數字至少列印一次,整體列印10^9 1不同的數字。
呼叫 f(1) 列印 a -1, f(0) 列印 a -2。20 以下的數字列印在這里。
f(10^9 - i) for i in 0...6 將至少列印一次7大于 10^9 的數字,總共列印大于 10^9 的數字。
因此,列印的不同數字的總數將是10^9 1 2 7=1000000010
如果您找到任何其他解決方案,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328820.html
下一篇:基于遞回的python排列演算法
