我必须创建一个递归函数来计算三种不同类型的二叉树的节点数,并且我习惯将它们保存在具有以下类型int * int * int的结果中,我认为我的推理是右。
type dtree =
Decision of string * int * dtree * string * int * dtree
| Chance of string * int * dtree * string * int * dtree
| Outcome of int
;;
let rec count dt =
match dt with
Decision(choiceL, costL, l, choiceR, costR, r) -> (x+1,y,z) count l count r
| Chance(eventL, probL, l, eventR, probR, r) -> (x,y+1,z) count l count r
| Outcome value -> (x,y,z+1)
;;
答案 0 :(得分:1)
我在您的代码中发现了许多问题,但如果您提出具体问题可能会更好。作为一个起点,您可以使用名称x
,y
和z
,而无需在任何地方定义它们。
我认为,问题的关键在于您需要为递归调用count l
和count r
返回的值指定名称。一旦他们有了名字,你就可以在树的当前级别的结果中使用它们。
<强>更新强>
这是一个将值添加到对列表中的函数。它具有与您正在寻找的相同的粗略结构:
let rec sumpairs pairs =
match pairs with
| [] -> (0, 0)
| (x, y) :: tail ->
let (subx, suby) = sumpairs tail in
(subx + x, suby + y)