Я решил задачу 10 Project Euler со следующим кодом, который работает с помощью грубой силы:
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: максимальная глубина рекурсии.
Что я сделал неправильно с моей рекурсивной функцией? Или существует какой-то конкретный способ избежать ограничения рекурсии?