F#在n-ary树中查找路径

时间:2017-05-20 16:02:43

标签: f#

鉴于此树类型:

type T<'a> = N of 'a * T<'a> list

可以声明为:

let ta = N("b", [N("c", [])])

我如何获得此树中的所有可能路径?我已尝试应用提到的in this post方法,但它只返回一个空列表。这就是我实施它的方式:

let rec isPath is t = 
    match t with
    | N(x, t) -> List.collect (isPath (x::is)) t

isPath [] ta |> (printf "isPath: %A")

但它只返回isPath: []。我究竟做错了什么?我的第二个目标是创建第二个函数,我可以传递一个int列表来检查是否有与此列表对应的路径。

1 个答案:

答案 0 :(得分:3)

您需要另一个匹配条件来捕获空列表并且不会迭代它们。现在你的List.collect,当t为空时,正在迭代一个空列表,因此将一个空列表返回到&#34;之前的&#34;递归函数的级别。然后将所有这些空列表附加在一起以获得...一个空列表,依此类推。

添加以下匹配案例,您应该得到所需内容:

| N(x, []) -> is

请注意,在其他匹配案例之前,应该以便工作:由于F#处理从上到下匹配案例,N(x, t)将匹配任何内容,N(x, [])如果它是第二个,我们将不会受到检查。

所以你希望你的功能看起来像:

let rec isPath is t = 
    match t with
    | N(x, []) -> is
    | N(x, t) -> List.collect (isPath (x::is)) t

同样,如果你不明白为什么会有效,请告诉我,我会进一步解释。