【发布时间】:2013-12-25 19:27:57
【问题描述】:
假设您想编写一个简单的数学归约器,例如,它将进行转换:
((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);
常量栈可以解决同样的问题吗?
【问题讨论】:
-
非递归...递归?
-
措辞不好,我仍然不确定如何命名。
-
是的,您可以通过在堆上使用堆栈(数据结构)使 any 递归程序迭代。
-
我猜 OP 询问是否可以仅使用 O(1) 空间自下而上遍历树。我想,如果你有直接指向树叶的指针并且节点有指向它们父母的指针,这是可能的。我不确定是否可以使用带 O(1) 空间的算法构建这样的树。
-
@Viclib 你只需将一个工作指针指向根,循环
while(not done){ ... }并移动一个工作指针,检测减少条件,尽可能用值替换节点,直到done.
标签: algorithm recursion language-agnostic