function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
findSequence(24);
这是来自Eloquent JavaScript。它的目的是给出一个数字,试图找到一个产生该数字的加法和乘法序列"。
我在Chrome中运行调试器,运行带有数字24的函数时,我在start
变量上获得了此堆栈。我正在尝试专门理解start
变量,因为它变化。
start
= 1 - 添加5。start
= 6 - 添加5。start
= 11 - 加5。start
= 16 - 添加5。start
= 21 - 添加5。start
= 26.大于24.返回null。开始返回21.尝试乘以3. start
= 63.大于24.返回null。开始返回21。正是在这一点上,start
从21变为16.为什么会这样?我没有在代码中看到任何可以将其恢复原状的内容。它重复16,将其乘以3,再回到16,然后再回到11.我真的很想知道这里发生了什么。
答案 0 :(得分:2)
1
+ 5 -- 6
+ 5 -- 11
+ 5 -- 16
+ 5 -- 21
+ 5 -- 26 > 24, returns null
x 3 -- 63 > 24, returns null
x 3 -- 38
...
...
这就是发生的事情。你在递归中更深入。你去了一个没有前进的地方。所以,你回到当前状态之前的地方。这就是为什么当你无法继续21
时,递归展开并让你从16
继续前进。这就是为什么start
再次为16
。