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

标签 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. 开始 = 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
+ 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

关于javascript - 有人可以解释一下这个递归代码是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115149/

相关文章:

Javascript 将 float 转换为指数

mysql - 在这种情况下递归是最佳解决方案吗?

java - 文件复制陷入无限循环

python - 使用 list.pop() 反转列表的问题

c - 我在代码块中编写的堆栈实现代码编译成功,但在运行时显示错误

用户输入的正确值未插入堆栈

javascript - 在现有对象中添加新元素

javascript - 使用 Javascript 和 json 文件更改 div 的背景颜色

javascript - var foo = (函数(){...})(); ... foo() 不起作用

javascript - 实现 redux compose 函数但得到 RangeError