我收到超过"最大递归深度"执行我的程序以解决此问题时出错。项目欧拉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))
答案 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)))