Índices de números de Fibonacci
Los primeros términos de la sucesión de Fibonacci son
0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Se observa que el 6º término de la sucesión (comenzando a contar en 0) es el número 8.
Definir la función
indiceFib :: Integer -> Maybe Integer
tal que (indiceFib x) es justo el número n si x es el n-ésimo términos de la sucesión de Fibonacci o Nothing en el caso de que x no pertenezca a la sucesión. Por ejemplo,
indiceFib 8 == Just 6 indiceFib 9 == Nothing indiceFib 21 == Just 8 indiceFib 22 == Nothing indiceFib 280571172992510140037611932413038677189525 == Just 200 indiceFib 123456789012345678901234567890123456789012 == Nothing
Soluciones
indiceFib :: Integer -> Maybe Integer indiceFib x | y == x = Just n | otherwise = Nothing where (y,n) = head (dropWhile (\(z,m) -> z < x) fibsNumerados) -- fibs es la lista de los términos de la sucesión de Fibonacci. Por -- ejemplo, -- take 10 fibs == [0,1,1,2,3,5,8,13,21,34] fibs :: [Integer] fibs = 0 : 1 : [x+y | (x,y) <- zip fibs (tail fibs)] -- fibsNumerados es la lista de los términos de la sucesión de Fibonacci -- juntos con sus posiciones. Por ejemplo, -- λ> take 10 fibsNumerados -- [(0,0),(1,1),(1,2),(2,3),(3,4),(5,5),(8,6),(13,7),(21,8),(34,9)] fibsNumerados :: [(Integer,Integer)] fibsNumerados = zip fibs [0..]