我的方法可能完全偏离了方向,但在解决这个问题的过程中,我试图获取数字 0-9 的所有排列的列表。
我正在考虑使用像这样的 n-ary 树来解决它:
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# 中的通用排列算法。