Árbol de computación de Fibonacci
La sucesión de Fibonacci es
1 |
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,... |
cuyos dos primeros términos son 0 y 1 y los restantentes se obtienen sumando los dos anteriores.
El árbol de computación de su 5º término es
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
5 / \ / \ / \ / \ / \ 3 2 / \ / \ / \ 1 1 2 1 / \ / \ / \ 1 0 1 1 1 0 / \ 1 0 |
que, usando los árboles definidos por
1 2 3 |
data Arbol = H Int | N Int Arbol Arbol deriving (Eq, Show) |
se puede representar por
1 2 3 4 5 6 7 8 9 |
N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1)) |
Definir las funciones
1 2 |
arbolFib :: Int -> Arbol nElementosArbolFib :: Int -> Int |
tales que
- (arbolFib n) es el árbol de computación del n-ésimo término de la sucesión de Fibonacci. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
λ> arbolFib 5 N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1)) λ> arbolFib 6 N 8 (N 5 (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) (N 2 (N 1 (H 1) (H 0)) (H 1))) (N 3 (N 2 (N 1 (H 1) (H 0)) (H 1)) (N 1 (H 1) (H 0))) |
- (nElementosArbolFib n) es el número de elementos en el árbol de computación del n-ésimo término de la sucesión de Fibonacci. Por ejemplo,
1 2 3 |
nElementosArbolFib 5 == 15 nElementosArbolFib 6 == 25 nElementosArbolFib 30 == 2692537 |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
data Arbol = H Int | N Int Arbol Arbol deriving (Eq, Show) -- 1ª definición -- ============= arbolFib :: Int -> Arbol arbolFib 0 = H 0 arbolFib 1 = H 1 arbolFib n = N (fib n) (arbolFib (n-1)) (arbolFib (n-2)) -- (fib n) es el n-ésimo elemento de la sucesión de Fibonacci. Por -- ejemplo, -- fib 5 == 5 -- fib 6 == 8 fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) -- 2ª definición -- ============= arbolFib2 :: Int -> Arbol arbolFib2 0 = H 0 arbolFib2 1 = H 1 arbolFib2 2 = N 1 (H 1) (H 0) arbolFib2 3 = N 2 (N 1 (H 1) (H 0)) (H 1) arbolFib2 n = N (a1 + a2) (N a1 i1 d1) (N a2 i2 d2) where (N a1 i1 d1) = arbolFib2 (n-1) (N a2 i2 d2) = arbolFib2 (n-2) -- 3ª definición -- ============= arbolFib3 :: Int -> Arbol arbolFib3 0 = H 0 arbolFib3 1 = H 1 arbolFib3 2 = N 1 (H 1) (H 0) arbolFib3 3 = N 2 (N 1 (H 1) (H 0)) (H 1) arbolFib3 n = N (a + b) i d where i@(N a _ _) = arbolFib3 (n-1) d@(N b _ _) = arbolFib3 (n-2) -- 1ª definición de nElementosArbolFib -- =================================== nElementosArbolFib :: Int -> Int nElementosArbolFib = length . elementos . arbolFib3 -- (elementos a) es la lista de elementos del árbol a. Por ejemplo, -- λ> elementos (arbolFib 5) -- [5,3,2,1,1,0,1,1,1,0,2,1,1,0,1] -- λ> elementos (arbolFib 6) -- [8,5,3,2,1,1,0,1,1,1,0,2,1,1,0,1,3,2,1,1,0,1,1,1,0] elementos :: Arbol -> [Int] elementos (H x) = [x] elementos (N x i d) = x : elementos i ++ elementos d -- 2ª definición de nElementosArbolFib -- =================================== nElementosArbolFib2 :: Int -> Int nElementosArbolFib2 0 = 1 nElementosArbolFib2 1 = 1 nElementosArbolFib2 n = 1 + nElementosArbolFib2 (n-1) + nElementosArbolFib2 (n-2) |
Pensamiento
Toda visión requiere distancia.
Antonio Machado
5 Comentarios