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。我真的很想知道这里发生了什么。
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
。