Índices de números de Fibonacci
Los primeros términos de la sucesión de Fibonacci son
1 |
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
1 |
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,
1 2 3 4 5 6 |
indiceFib 8 == Just 6 indiceFib 9 == Nothing indiceFib 21 == Just 8 indiceFib 22 == Nothing indiceFib 280571172992510140037611932413038677189525 == Just 200 indiceFib 123456789012345678901234567890123456789012 == Nothing |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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, -- ghci> 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..] |
En Maxima
1 2 3 4 5 6 7 8 9 |
indiceFib (n) := block([a:0,b:1,c:1,p:0], unless n <= a do (a : b, b : c, c : a + b, p : p + 1), if n = a then Just (p) else Nothing)$ |
7 Comentarios