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

时间:2014-04-16 16:32:12

标签: javascript recursion stack

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。
  8. 正是在这一点上,start从21变为16.为什么会这样?我没有在代码中看到任何可以将其恢复原状的内容。它重复16,将其乘以3,再回到16,然后再回到11.我真的很想知道这里发生了什么。

1 个答案:

答案 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