Árbol de las divisiones por 2, 3 ó 5
En la librería Data.Tree se definen los árboles y los bosques como sigue
data Tree a = Node a (Forest a) type Forest a = [Tree a]
Se pueden definir árboles. Por ejemplo,
ej = Node 3 [Node 5 [Node 9 []], Node 7 []]
Y se pueden dibujar con la función drawTree. Por ejemplo,
λ> putStrLn (drawTree (fmap show ej)) 3 | +- 5 | | | `- 9 | `- 7
Definir la función
arbolDivisiones :: Int -> Tree Int
tal que (arbolDivisiones x) es el árbol de las divisiones enteras de x entre 2, 3 ó 5. Por ejemplo,
λ> putStrLn (drawTree (fmap show (arbolDivisiones 20))) 20 | +- 10 | | | +- 5 | | | | | `- 1 | | | `- 2 | | | `- 1 | `- 4 | `- 2 | `- 1 λ> putStrLn (drawTree (fmap show (arbolDivisiones 30))) 30 | +- 15 | | | +- 5 | | | | | `- 1 | | | `- 3 | | | `- 1 | +- 10 | | | +- 5 | | | | | `- 1 | | | `- 2 | | | `- 1 | `- 6 | +- 3 | | | `- 1 | `- 2 | `- 1
Soluciones
import Data.Tree (Tree (Node), drawTree) arbolDivisiones :: Int -> Tree Int arbolDivisiones x = Node x (map arbolDivisiones (divisiones x)) -- (divisiones x) es la lista de las divisiones enteras de x entre 2, 3 -- y 5. Por ejemplo, -- divisiones 30 == [15,10,6] -- divisiones 15 == [5,3] divisiones :: Int -> [Int] divisiones x = [x `div` y | y <- [2,3,5], x `mod` y == 0]