2010 Ejercicio 2: Sumar los términos pares de la sucesión de Fibonacci que no superen los 4000000
De Software Libre para la Enseñanza y el Aprendizaje de las Matemáticas (2010-11)
Enunciado
Sumar los términos pares de la sucesión de Fibonacci menores de 4000000.
Solución
La solución que propongo está escrita en lenguaje Groovy. Aunque el enunciado presenta la sucesión de Fibonacci como 1,2,3,5,... en muchos otros sitios aparece como 0,1,1,2,3,5,... De todas formas, como nos quedamos con los términos pares no hay problema
Solución: 4613732. Primero construyo la sucesión y a continuación sumo los términos pares. Obsérvese el uso de índices negativos para acceder a las posiciones última y penúltima de la lista y así construir el siguiente término de la sucesión
def sucesion = [1, 2] while (sucesion.last() < 4000000) { sucesion << sucesion .getAt(-1) + sucesion .getAt(-2) } def suma_pares = sucesion.findAll { it % 2 == 0 }.sum() println suma_pares
Solución alternativa (con wxMaxima 0.8.4)
La solución que propongo está escrita en Maxima, que es un sistema de cálculo simbólico escrito en Lisp.
Mi solución es: 3524578. Esta solución se corresponde con la suma de n números de Fibonacci, siendo n par y Fib[n] menor que 4000000. Concretamente el algoritmo realiza un total de 34 iteraciones (de la 0 a la 33), siendo el último término de Fibonacci sumado Fib[32]. El algoritmo utilizado es el siguiente:
(%i1) fib1[0]:0$ fib1[1]:1$ fib1[n]:=fib1[n-1]+fib1[n-2]$ s: 0$ for i: 0 step 1 while fib1[i] < 4000000 do ( print ("Fibonacci it. ",i," = ",fib1[i]), if (i >= 2) then ( if (mod(i,2) = 0) then( s: s+fib1[i], print("La suma par es: ", s) ) ) );
Dicho algoritmo imprime para cada iteración i el término de la sucesión de Fibonacci correspondiente (Fib[i]), así como la suma acumulada si la iteración i es par. Un ejemplo del resultado obtenido será el siguiente:
(%o1) Fibonacci it. 0 = 0 Fibonacci it. 1 = 1 Fibonacci it. 2 = 1 La suma par es: 1 Fibonacci it. 3 = 2 Fibonacci it. 4 = 3 La suma par es: 4 Fibonacci it. 5 = 5 Fibonacci it. 6 = 8 La suma par es: 12 .... .... Fibonacci it. 30 = 832040 La suma par es: 1346268 Fibonacci it. 31 = 1346269 Fibonacci it. 32 = 2178309 La suma par es: 3524577 Fibonacci it. 33 = 3524578