Inspirado por this question, yo quería probar mi mano en la última ponder this challenge, utilizando F #caminos Extracción de hojas de árbol de n-aria en F #
Mi enfoque es probablemente completamente fuera de curso, pero en el transcurso de la solución de este problema , Estoy tratando de obtener una lista de todas las permutaciones de los dígitos 0-9.
estoy mirando a resolverlo utilizando un árbol n-ario de este modo:
type Node =
| Branch of (int * Node list)
| Leaf of int
estoy bastante satisfecho de mí mismo, porque me las he arreglado para encontrar la manera de generar el árbol de que yo querer.
Mi problema ahora es que no puedo averiguar cómo atravesar este árbol y extraer la 'ruta' de cada hoja como un int. Lo que me confunde es que necesito unirme en nodos individuales, pero mi función 'externa' debe tomar una lista de nodos.
Mi intento de corriente casi hace lo correcto, excepto que me devuelve la suma de todos los caminos ...
let test = Branch(3, [Branch(2, [Leaf(1)]);Branch(1, [Leaf(2)])])
let rec visitor lst acc =
let inner n =
match n with
| Leaf(h) -> acc * 10 + h
| Branch(h, t) -> visitor t (acc * 10 + h)
List.map inner lst |> List.sum
visitor [test] 0 //-> gives 633 (which is 321 + 312)
Y ni siquiera estoy seguro de que este es recursiva de cola.
(Eres muy bienvenido a proponer otra solución para encontrar permutaciones, pero todavía estoy interesado en la solución a este problema en particular)
EDIT: He publicado un algoritmo de permutaciones genéricos en Fa # here.
Gracias, ¿es esa cola recursiva? Si no, ¿podría hacerse así? ¿Y cómo lo digo? Y otra pregunta, ¿es posible hacer esto perezoso? Quiero detenerme una vez que encuentre 'la respuesta'. – Benjol
Hola, hacer esta repetición de cola sería bastante difícil, porque está procesando un árbol, por lo que necesita mantener un cierto estado durante el procesamiento. Podrías escribir esto usando continuaciones, pero eso no sería tan fácil ... –