Javascript 有人能解释一下这个递归代码是如何工作的吗?
这是来自雄辩的JavaScript。它的目的是“给定一个数字,试图找到产生该数字的加法和乘法序列” 我已经在Chrome中运行了调试器,当运行数字为24的函数时,我在Javascript 有人能解释一下这个递归代码是如何工作的吗?,javascript,recursion,stack,Javascript,Recursion,Stack,这是来自雄辩的JavaScript。它的目的是“给定一个数字,试图找到产生该数字的加法和乘法序列” 我已经在Chrome中运行了调试器,当运行数字为24的函数时,我在start变量上得到了这个堆栈。我试图具体理解start变量的变化 开始=1-添加5 开始=6-添加5 开始=11-添加5 开始=16-添加5 开始=21-添加5 开始=26。大于24。返回null。开始返回到21。试着乘以3 开始=63。大于24。返回null。开始返回到21 正是在这一点上,start从21变为16。为什么会这样
start
变量上得到了这个堆栈。我试图具体理解start
变量的变化
开始
=1-添加5开始
=6-添加5开始
=11-添加5开始
=16-添加5开始
=21-添加5开始
=26。大于24。返回null。开始返回到21。试着乘以3开始
=63。大于24。返回null。开始返回到21start
从21变为16。为什么会这样?我在代码中看不到任何会让它倒下的东西。它重复16次,乘以3,回到16,然后再回到11。我真的很想知道这里发生了什么
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);
这就是正在发生的事情。您可以在递归中进行更深入的研究。你去了一个没有前进的地方。所以,你回到当前状态之前的地方。这就是为什么当您无法继续执行21
时,递归将展开,并允许您从16
继续执行其他路径。这就是为什么start
又是16
。我明白了!当你说它“展开”时,是不是只是JavaScript“知道”不要回到那个数字?所以它不会再加上5到16,因为这会使它回到21,而是乘以3,这不起作用,所以它会回到以前的状态11?因此,它不会返回到以前“尝试过”的数字?find(开始+5“(“+history+”+5)”)
和find(开始*3“(“+history+”*3)”)
在start
为21时返回null
。因此,它返回null
。返回给谁?使用start
和21
调用此函数的人。这是相同的函数,当start
为16时,添加5并调用它。由于,16的find(start*5,(“+history+”+5)”)
返回了null
,当start为16
时,它会转到find(start*3,(“+history+”*3)”)
。明白了吗?我知道这有点令人困惑:)
1
+ 5 -- 6
+ 5 -- 11
+ 5 -- 16
+ 5 -- 21
+ 5 -- 26 > 24, returns null
x 3 -- 63 > 24, returns null
x 3 -- 38
...
...