【发布时间】:2011-01-24 23:29:48
【问题描述】:
我使用以下代码解决了 Project Euler 的问题 10,该代码通过蛮力运行:
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: 超出最大递归深度。
我的递归函数做错了什么?还是有一些特定的方法可以避免递归限制?
【问题讨论】: