我用以下代码通过暴力破解方式解决了欧拉计划的第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: maximum recursion depth exceeded。
我的递归函数哪里出了问题?或者有没有一些特定的方法可以避免递归限制?