I resuelto el problema 10 de Proyecto Euler con el siguiente código, que trabaja a través de la fuerza bruta:Python error función recursiva: "profundidad de recursión máximo excedido"
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)))
Las tres funciones funcionan como sigue:
- isPrime comprueba si un número es primo;
- primeList devuelve una lista que contiene un conjunto de números primos para un cierto intervalo con un límite de 'n', y;
- sumPrimes resume los valores de todos los números en una lista. (No es necesario Esta última función, pero me gusta la claridad de la misma, sobre todo para un principiante como yo.)
Entonces escribí una nueva función, primeListRec, que hace exactamente lo mismo que primeList, para ayudar a comprender mejor la recursividad:
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
La función recursiva anteriormente trabajó, pero sólo para valores muy pequeños, como '500'. La función provocó que mi programa fallara cuando coloqué '1000'. Y cuando puse un valor como '2000', Python me dio esto:
RuntimeError: la profundidad máxima de recursión superó.
¿Qué hice mal con mi función recursiva? ¿O hay alguna forma específica de evitar un límite de recursión?
¿La recursividad es en absoluto un enfoque viable en Python? ¿La mayoría de los programadores de Python lo evitan? (es decir, ¿no es pitthonic?) – anonnoir
La recursión de cola no ayudaría en este caso ya que la llamada recursiva no es la última operación en la función. –
Es un enfoque viable cuando la versión iterativa necesitaría una pila de todos modos (por ejemplo, atravesar un árbol, producir permutaciones, etc.) y la profundidad de recursión está limitada a un tamaño razonable. En este caso, está tratando de utilizar la recursión de manera artificial, ya que era claramente un ciclo for lo que necesitaba. – fortran