Suma de números de Fibonacci con índice impar
La sucesión de Fibonacci, F(n), es la siguiente sucesión infinita de números naturales:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...
La sucesión comienza con los números 0 y 1. A partir de estos, cada término es la suma de los dos anteriores.
Definir la función
sumaFibsIndiceImpar :: Int -> Integer
tal que (sumaFibsIndiceImpar n) es la suma de los n primeros términos de la sucesión de Fibonacci no índice impar; es decir,
sumaFibsIndiceImpar n = F(1) + F(3) + ... + F(2*n-1)
Por ejemplo,
sumaFibsIndiceImpar 1 == 1 sumaFibsIndiceImpar 2 == 3 sumaFibsIndiceImpar 3 == 8 sumaFibsIndiceImpar 4 == 21 sumaFibsIndiceImpar 5 == 55 sumaFibsIndiceImpar (10^4) `rem` (10^9) == 213093125
En los ejemplos anteriores se observa que
sumaFibsIndiceImpar 1 == F(2) sumaFibsIndiceImpar 2 == F(4) sumaFibsIndiceImpar 3 == F(6) sumaFibsIndiceImpar 4 == F(8) sumaFibsIndiceImpar 5 == F(10)
Comprobar con QuickCheck que (sumaFibsIndiceImpar n) es F(2n); es decir, el 2n-ésimo número de Fibonacci
Soluciones
import Test.QuickCheck sumaFibsIndiceImpar :: Int -> Integer sumaFibsIndiceImpar n = sum [fib (2*k-1) | k <- [1..n]] -- (fib n) es el n-ésimo término de la sucesión de Fibonacci. Por -- ejemplo, -- fib 6 == 8 fib :: Int -> Integer fib n = fibs !! n -- fibs es la lista de términos de la sucesión de Fibonacci. Por ejemplo, -- λ> take 20 fibs -- [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181] fibs :: [Integer] fibs = 0 : 1 : zipWith (+) fibs (tail fibs) -- La propiedad es prop_sumaFibsIndiceImpar :: Int -> Property prop_sumaFibsIndiceImpar n = n >= 0 ==> sumaFibsIndiceImpar n == fib (2*n) -- La comprobación es -- λ> quickCheck prop_sumaFibsIndiceImpar -- +++ OK, passed 100 tests.
Referencia
- Sum of sequence of odd index Fibonacci numbers en ProofWiki.