Caminos minimales en un árbol numérico

En la librería Data.Tree se definen los árboles y los bosques como sigue

Se pueden definir árboles. Por ejemplo,

Y se pueden dibujar con la función drawTree. Por ejemplo,

Los mayores divisores de un número x son los divisores u tales que u > 1 y existe un v tal que 1 < v < u y u*v = x. Por ejemplo, los mayores divisores de 24 son 12, 8 y 6.

El árbol de los predecesores y mayores divisores de un número x es el árbol cuya raíz es x y los sucesores de cada nodo y > 1 es el conjunto formado por y-1 junto con los mayores divisores de y. Los nodos con valor 1 no tienen sucesores. Por ejemplo, el árbol de los predecesores y mayores divisores del número 6 es

Definir las siguientes funciones

tales que

  • (mayoresDivisores x) es la lista de los mayores divisores de x. Por ejemplo,

  • (arbol x) es el árbol de los predecesores y mayores divisores del número x. Por ejemplo,

  • (caminos x) es la lista de los caminos en el árbol de los predecesores y mayores divisores del número x. Por ejemplo,

  • (caminosMinimales x) es la lista de los caminos en de menor longitud en el árbol de los predecesores y mayores divisores del número x. Por ejemplo,

Soluciones

6 Comentarios

    1. En la definición de ramas se puede sustituir la expresión «concat $ map ramas bosque» por «concatMap ramas bosque»:

    1. Buenas, la definición de caminosMinimales no es correcta. Por ejemplo:

      Donde caminosMinimales2 es tu función.

      1. No estaba muy seguro de como la función minimum funcionaba en esos casos, pero parecía funcionar xD.
        Creo que esta nueva definición soluciona el problema.

  1. Un intento de solución de un iniciado en la programación dinámica en Haskell.
    He decido hacer el array de tamaño 300 porque mayor que este tamaño ya tarda demasiado en hacerme el árbol y aunque realmente mi idea inicial era hacerlo de tamaño n no tengo ni idea de como, también podría haber usado vectores pero tampoco sé como funcionan estos en Haskell.
    He hecho algo parecido a la función árbol con la función caminos y para la función caminosMinimales simplemente he usado la de angruicam1, aunque se puede optimizar con un método parecido al de la función caminos.

Escribe tu solución