我解决问题10项目欧拉的用下面的代码,它通过蛮力的工作原理:Python的递归函数错误:“最大递归深度超过”
def isPrime(n):
for x in range(2, int(n**0.5)+1):
if n % x == 0:
return False
return True
def primeList(n):
primes = []
for i in range(2,n):
if isPrime(i):
primes.append(i)
return primes
def sumPrimes(primelist):
prime_sum = sum(primelist)
return prime_sum
print (sumPrimes(primeList(2000000)))
这三种功能的工作方式如下:
- isPrime检查一个数是否是素数;
- primeList返回一个列表,其中包含一组具有限制'n'的范围的素数,并且;
- sumPrimes总结列表中所有数字的值。 (不需要这最后的功能,但我喜欢它的清晰度,特别是对于像我这样的初学者。)
然后我写了一个新的功能,primeListRec,这不正是同样的事情primeList,帮助我更好地理解递归:
def primeListRec(i, n):
primes = []
#print i
if (i != n):
primes.extend(primeListRec(i+1,n))
if (isPrime(i)):
primes.append(i)
return primes
return primes
上述递归函数的工作,但仅限于非常小的值,如“500”。当我输入'1000'时,该函数导致我的程序崩溃。当我输入像'2000'这样的值时,Python给了我这个:
RuntimeError:超过最大递归深度。
我的递归函数有什么问题?还是有一些具体的方法来避免递归限制?
然后在Python中使用可行的方法递归吗?大多数Python程序员是否会避免它? (即它是否是Pythonic?) – anonnoir
由于递归调用不是函数中的最后一个操作,尾递归在这种情况下不起作用。 –
当迭代版本无论如何需要堆栈时(例如遍历一棵树,产生排列等)并且递归深度被限制到合理的大小时,这是一种可行的方法。在这种情况下,您试图以人为的方式使用递归,因为它显然是您需要的循环。 – fortran