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] |
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 []] |
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 |
λ> putStrLn (drawTree (fmap show ej))
3
|
+- 5
| |
| `- 9
|
`- 7
Definir la función
arbolDivisiones :: Int -> Tree Int |
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 |
λ> 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] |
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]
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>