Вдохновленный этим вопросом , я хотел попробовать свои силы в последней обдумать этот вызов , используя 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 # здесь .