我试图解决项目欧拉问题(编号52),该问题要求最小整数n,使得n,2n,3n,4n,5n,6n都具有相同的十进制数字置换。我以为我开始使用蛮力程序(作为我自己的编程练习),它寻找一个整数n,使得n和2n具有相同的数字(项目Euler问题提到125874是一个这样的整数,所以我认为一个蛮力计划会起作用)。所以我编写了一个python程序,按顺序查看每个整数,创建一个排序的数字列表,并将该列表与2n的排序数字列表进行比较。我的程序似乎是迭代的,所以我不确定为什么它会在几分之一秒后停止运行并发送回来"相比之下超过最大递归深度"。我决定在函数" k"中绑定无界搜索。下面看它到底有多远,而且似乎不高于n = 100,000。鉴于每次调用k,它只需要排序和比较两个大小不超过6的列表,我想知道它为什么会给我这个错误?我搜索了错误,并建议增加递归限制,所以我添加了" sys.setrecursionlimit(2000)"你看。
这是我的代码:
函数f取整数并返回其数字列表。 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))
答案 0 :(得分:2)
关注这一部分:
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)
对此无能为力。迭代地遍历n
的不同值,即循环。