假设你想编写一个简单的数学减速器,例如,它将进行转换:
((add ((add 2) 3)) ((add 4) 2)) -> 11
一个简单的算法可能是(例如在JavaScript中):
function r(a){
if (typeof(a)!=="object") return a;
var a = [r(a[0]), r(a[1])];
return a[0][0]==="add" ? a[0][1] + a[1] : a;
}
console.assert(r([["add",[["add",2],3]],[["add",4],2]]) === 11);
是否有可能用常量堆栈解决同样的问题?
答案 0 :(得分:1)
可以使用堆上的堆栈和循环来模拟任何递归算法。所以,是的,可以在单个函数调用中执行此操作。
如果您正在讨论遍历常量空间中的单个链接树(包括堆栈和堆),那么不,您不能这样做(您必须记住你的方式备份)。
答案 1 :(得分:1)
如果将树结构转换为zipper,则可以使用状态机遍历它。它不再是简单的树,而是允许你使它非递归或尾递归。
答案 2 :(得分:1)
是的,可以在不使用递归,显式维护堆栈或修改树节点的情况下对二叉树进行深度优先遍历。
生成的算法需要O(1)额外空间和O(n ^ 2)时间。