Извлечение листовых путей из n-арного дерева в F #

Вдохновленныйэтот вопросЯ хотел попробовать свои силы не позднееобдумать этот вызов, используя F #

Мой подход, вероятно, полностью отклоняется от курса, но в процессе решения этой проблемы я пытаюсь получить список всех перестановок цифр 0-9.

Я смотрю на решение этой проблемы с помощью n-арного дерева следующим образом:

type Node = 
    | Branch of (int * Node list)
    | Leaf of int

Я очень доволен собой, потому что мне удалось решить, как создать дерево, которое я хочу.

Моя проблема сейчас в том, что я не могу понять, как пройти по этому дереву и извлечь «путь» к каждому листу в виде целого числа. Меня смущает то, что мне нужно сопоставлять отдельные узлы, но моя «внешняя» функция должна принимать список узлов.

Моя текущая попытка почти делает правильные вещи, за исключением того, что она возвращает мне сумму всех путей ...

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)

И я даже не уверен, что это хвостовая рекурсия.

(Вы можете предложить другое решение для поиска перестановок, но я все еще заинтересован в решении этой конкретной проблемы)

РЕДАКТИРОВАТЬ: я опубликовал общий алгоритм перестановок в F #Вот.

Ответы на вопрос(2)

Ваш ответ на вопрос