如果有人可以帮我理解这段代码:
let rec fold_tree f (T(x,l))=
f x (map (fold_tree f) l);;
它是如何工作的?我的意思是主要是递归。
答案 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 - 拿一支纸一支铅笔,然后尝试重现测试用例的输出。