【发布时间】:2014-01-17 10:37:56
【问题描述】:
我有以下实现二叉树和一个深度函数来计算它的深度:
type 'a btree =
| Empty
| Node of 'a * 'a btree * 'a btree;;
let rec depth t = match t with
| Empty -> 0
| Node (_, t1, t2) -> 1 + Int.max (depth t1) (depth t2)
这里的问题是“深度”是递归的,当树太大时会导致堆栈溢出。
我读到了尾递归以及编译器如何将其优化为 while 循环以删除堆栈调用。
你会如何让这个函数尾递归或者让它使用 while/for 循环来代替?
【问题讨论】:
-
将其转换为尾递归或迭代算法需要使用显式堆栈。这是一个真正的问题还是只是一个练习?因为在实际应用中,您要么确保树是平衡的,因此递归不会太深,要么在构造节点时将深度存储在节点中。
-
感谢您为实际应用提供的提示。不过,这是一个练习。
标签: recursion ocaml binary-tree tail-recursion