Project Euler#5中的RecursionError

时间:2016-08-04 05:41:23

标签: python recursion

我收到超过"最大递归深度"执行我的程序以解决此问题时出错。项目欧拉question #5要求找到:

  

可以被1到10之间的所有数字整除的最小正数。

我试图编写一个递归检查x是否可被每个整数1-10整除的程序,如果它没有,那么我们再次使用x调用它增加1并重复,直到找到x。 (在这种情况下,答案是2520,这就是我添加if语句的原因。)

def euler5(x):

    if x < 2521:
        for i in range(1, 11):
            if x % i == 0:
                print(x)

            else:
                euler5(x+1)

    else:
        print(x)


x = 2
print(euler5(x))

2 个答案:

答案 0 :(得分:4)

原因是Python(或至少CPython)具有有限的堆栈大小并且没有尾调用优化。所以你不能在Python中使用无界递归,不像Scheme(例如)。

解决方案是使用常规循环:

x = 0
while True:
    x += 1
    # Put loop body here

答案 1 :(得分:-1)

在你定义的函数中,即使你不懂数学函数,也可以循环。但是,您的代码效率不高,因为程序必须不断检查值以查看它是否与条件匹配。建议不要使用递归,因为它应该可以灵活地与其他值一起使用,而不仅仅是针对此问题。欧拉问题旨在培养您的编码实践。

可以使用更好的方法来简化代码:

from functools import reduce
from fractions import gcd
def lcm(a,b):
    return a*b//gcd(a,b) #gcd is greatest common divisor AKA HCF

print (reduce(lcm, range(1, 20+1)))