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:
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.
