[英]Why does this iterative program exceed recursion limit?
我正在嘗試解決一個項目歐拉問題(編號 52),該問題要求最小的 integer,n,使得 n、2n、3n、4n、5n、6n 都具有相同的十進制數字排列。 我想我會從一個蠻力程序開始(作為我自己的編程練習),它尋找一個 integer n 使得 n 和 2n 具有相同的數字(項目歐拉問題提到 125874 就是這樣一個 integer,所以我想蠻力程序會起作用)。 所以我編寫了一個 python 程序,它按順序查看每個 integer,創建其數字的排序列表,並將該列表與 2n 的排序數字列表進行比較。 我的程序似乎是迭代的,所以我不確定為什么它會在幾分之一秒后停止運行並發回“比較中超出的最大遞歸深度”。 我決定在下面的 function "k" 中綁定無界搜索,看看它走了多遠,它似乎沒有超過 n= 100,000。 鑒於每次調用 k 時,它只需要對兩個大小不超過 6 的列表進行排序和比較,我想知道為什么它會給我這個錯誤? 我用谷歌搜索了這個錯誤,有人建議增加遞歸限制,所以我添加了你看到的“sys.setrecursionlimit(2000)”。
這是我的代碼:
function f 采用 integer 並返回其數字列表。 g 對它們進行排序。 h 比較 n 和 2n 的列表。 和 k 迭代。
import math
import sys
sys.setrecursionlimit(2000)
def f(n, l):
if (math.floor(n / 10) == 0):
l.append(n)
return l
else:
l.append(n % 10)
return f(int((n - (n % 10)) / 10), l)
def g(n):
return sorted(f(n, []))
def h(n):
if ((g(n) == g(2 * n))):
return 1
else:
return 0
def k(n):
if ((h(n) == 1)):
return n
elif ((n <= 100000)):
return k(n + 1)
else:
return "checked up to bound"
print(k(1))
重點介紹這部分:
def k(n):
if ((h(n) == 1)):
return n
elif ((n <= 100000)):
return k(n + 1)
125874
是h(n) == 1
的最小數,因此遞歸調用k(1), k(2), k(3), ... k(125874)
。 sys.setrecursionlimit(2000)
。 Go 通過n
的不同值迭代,即用一個循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.