OCaml fold_tree和令人困惑的递归

时间:2013-10-25 16:59:59

标签: recursion ocaml

如果有人可以帮我理解这段代码:

let rec fold_tree f (T(x,l))=
  f x (map (fold_tree f) l);;

它是如何工作的?我的意思是主要是递归。

2 个答案:

答案 0 :(得分:0)

如果我正在编写树的折叠函数,我会尝试定义('a -> 'b -> 'b) -> 'a tree -> b -> b类型的东西。也就是说,要折叠的函数将从树节点和累积值中获取值并产生新的累积值。 (然后有趣的问题是访问节点的顺序。)

在此fold_tree中,要折叠的函数的类型为('a -> 'b list -> 'b)。也就是说,它采用累积值列表而不是单个值。这使得使用起来有点笨拙。

然而,它确实在时尚之后起作用。本质上,定义在散文中说明以下内容:对于叶子,调用函数f将节点值x和空列表传递给它。对于非叶子,首先在所有子树上递归调用,然后调用函数f向其传递节点值和递归调用的结果列表。

我希望这会有所帮助。

答案 1 :(得分:0)

我认为您的数据类型声明如下:

type 'a ntree = T of 'a * 'a ntree list;;

现在解决问题的最佳方法是:
1-看一下它的类型签名,

val fold_tree : ('a -> 'b list -> 'b) -> 'a ntree -> 'b = <fun>

2 - 根据类型签名编写测试用例

let test_rtree = T("a", [ T("b", []) ; T("c", [ T ("f", [])]) ; T("d", [])])  
in fold_tree (List.fold_left (^)) test_rtree;;
- : string = "abcfd"

3 - 拿一支纸一支铅笔,然后尝试重现测试用例的输出。