Euler 2 (Python)

Enunciado 2

Cada nuevo item en la secuencia de Fibonacci es generado sumando los dos términos previos. Empezando con 1 y 2, los primeros 10 términos serían:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Encontrar la suma de todos los términos pares en la secuencia que no supera los 4 millones.

Solución

La solución fue obtenida en el intérprete interactivo de Python 2.5.2:

>>> MAX = 4000000
>>> def evsum(n):
...     s = 0
...     a,b = 1,2
...     while True:
...         if a >= n:
...             break
...         if a % 2 ==0:
...             print a, " ",
...             s += a
...         a,b = b,a+b
...     return s
...
>>> evsum(MAX)
2   8   34   144   610   2584   10946   46368   196418   832040   3524578
4613732

Python tips

  • La asignación múltiple es un idom muy cómodo: a,b = 1,2
  • Si agregamos una coma final a la enumeración de objetos a ser impresos con print, se logra el efecto de que no se imprima el salto de línea (\n) final.

About Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí un libro de cuentos que se puede descargar gratuitamente.
This entry was posted in Aprendiendo Python, Problemas and tagged , . Bookmark the permalink.
  • http://patriciogomez.com.ar patricio

    JJ, excelente como siempre, y van algunos comentarios para que me desasnes un poco:

    Primero, que ventaja tiene hacer un while true, y despues chequear que a >= n, en lugar de hacer directamente while a <=n?

    Segundo, el return s es necesario?

    Saludos

  • Juanjo

    1) El while True con un break si a >=n es equivalente al while a < n. Empecé con un while True por que lo escribí en el intérprete de un solo tirón y no sabía bien como iba a ser la forma del algoritmo :)
    2) Sin el return la función no devuelve ningún valor y por más que en s quede el resultado, no puedo enterarme cual es.

  • http://www.miltonpividori.com.ar Milton Pividori

    Muy buenos estos posts Juanjo. A pesar de ser cortos dicen mucho, y voy aprendiendo siempre un poquito de Python.

    Un abrazo!

  • Juanjo

    Exactamente esa es la idea, Milton! Saludos!

  • http://nqnwebs.com/blog martin gaitan

    mi solución

    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])