Project Euler, Problema #2
Publicado el 20 de septiembre de 2009 | Categoría/s: Python

El problema nº 2 pide obtener la suma de todos los números impares pertenencientes a la sucesión de Fibonacci menores a 4 millones.

El código con el que lo resolví es este:

def fibo(max):
    a, b = 0, 1
    n = a + b
    while n < max:
        yield n
        a, b = b, n
        n = a + b
sum([i for i in fibo(4000000) if i%2 == 0])

El resultado es 4613732.

Explicación

Fibonacci es el "hola mundo matemático" y Python luce su elegancia con este problema.

El aspecto interesante de la función fibo() definida en el código de arriba es que no se trata de una función común sino de un generador. Sintácticamente la diferencia está en que no utiliza la sentencia return sino yield .

La definición de yield. en su acepción de verbo, dice «end resistance, especially under pressure or force;». Ceder, no oponer resistencia.

La diferencia sustancial entre un yield y un return es que el yield devuelve el resultado parcial de cada iteración y hace una "marca de entrada" desde donde se comenzará a ejecutar la próxima vez que la función (el generador) sea invocado.

Esto permite una recursividad con "evaluación perezosa", mucho más eficiente en términos computacionales.

El Filtrado de los numeros impares de la sucesión y la sumatoria es la misma solución que se apliqué en el problema 1.

blog comments powered by Disqus


NqN/webs :: Desarrollo, Diseño y Hosting de Sitios Web por Martín Gaitán
Neuquén & Córdoba - Argentina - © Año 2004/2009 - Tel (+54) 0351 460·1524 - Celular: (+54) 351 153·308454
Contacto | Pagos | RSS | SPIP | Usa Firefox