この質問に触発されて、F# を使用して、この課題について最新の熟考に取り組みたいと思いました。
私のアプローチはおそらく完全にコースから外れていますが、この問題を解決する過程で、数字 0 から 9 のすべての順列のリストを取得しようとしています。
次のようなn分木を使用して解決することを検討しています:
type Node =
| Branch of (int * Node list)
| Leaf of int
必要なツリーを生成する方法を見つけることができたので、私は非常に満足しています。
私の問題は、このツリーをトラバースして、各リーフへの「パス」を 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# の一般的な順列アルゴリズムをここに投稿しました。