Zainspirowany this question, chciałem spróbować swoich sił w najnowszej ponder this challenge za pomocą F #Wydobywanie liści ścieżki n-ary drzewa w F #
Moje podejście jest chyba całkowicie z kursu, ale w trakcie rozwiązywania tego problemu , Próbuję uzyskać listę wszystkich permutacji cyfr 0-9.
Czekam na rozwiązanie go za pomocą drzewa n-ary tak:
type Node =
| Branch of (int * Node list)
| Leaf of int
jestem bardzo z siebie zadowolony, bo udało mi się wypracować jak wygenerować drzewo że chcieć.
Mój problem polega na tym, że nie mogę zrozumieć, jak przejść przez to drzewo i wyodrębnić "ścieżkę" do każdego liścia jako int. Rzeczą, która mnie myli, jest to, że muszę dopasowywać poszczególne węzły, ale moja "zewnętrzna" funkcja musi przyjąć listę węzłów.
Moja obecna próba prawie robi słusznie, z wyjątkiem tego, że zwraca mi sumę wszystkich ścieżkach ...
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)
I nie jestem nawet pewien, że jest to ogon rekurencyjnej.
(Jesteś bardzo mile widziane, aby zaproponować inne rozwiązanie dla znalezienia permutacji, ale ja nadal jestem zainteresowany rozwiązanie tego konkretnego problemu)
EDIT: Mam napisali algorytmu permutacji rodzajowe w F # here.
Dzięki, czy ten ogon jest rekurencyjny? Jeśli nie, czy można to zrobić? I jak mam powiedzieć? I kolejne pytanie, czy to możliwe, aby to leniwe? Chcę przestać, gdy tylko znajdę "odpowiedź". – Benjol
Witam, dzięki temu ten recurisve będzie dość trudny, ponieważ przetwarza drzewo - więc musi zachować pewien stan podczas przetwarzania. Możesz napisać to, używając kontynuacji, ale to nie byłoby takie proste ... –