提问者:小点点

有人能解释一下这个递归代码是如何工作的吗?


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变量的变化。

  1. start=1-添加5。
  2. start=6-添加5。
  3. start=11-添加5。
  4. start=16-添加5。
  5. start=21-添加5。
  6. start=26。大于24。返回null。开始返回21。尝试乘以3。
  7. start=63。大于24。返回null。开始返回21。

正是在这一点上,start从21更改为16。这是为什么?我在代码中看不到任何会使它回落的东西。它对16重复此操作,将其乘以3,返回16,然后返回11。我真的很想知道这里发生了什么。


共1个答案

匿名用户

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