为什么这个迭代程序超过了递归限制?

时间:2016-12-27 00:31:06

标签: python

我试图解决项目欧拉问题(编号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))

1 个答案:

答案 0 :(得分:2)

关注这一部分:

def k(n):
    if ((h(n) == 1)):
        return n
    elif ((n <= 100000)):
        return k(n + 1)

125874h(n) == 1的最小数字,因此递归调用k(1), k(2), k(3), ... k(125874)sys.setrecursionlimit(2000)对此无能为力。迭代地遍历n的不同值,即循环。

相关问题