繁体   English   中英

有人可以解释一下此递归代码如何工作吗?

[英]Can someone please explain how this recursive code works?

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
+ 5 -- 6
       + 5 -- 11
               + 5 -- 16
                       + 5 -- 21
                               + 5 -- 26 > 24, returns null
                               x 3 -- 63 > 24, returns null
                       x 3 -- 38
...
...

这就是正在发生的事情。 您可以更深入地进行递归。 您去的地方没有前进的脚步。 因此,您返回到当前状态之前的位置。 这就是为什么当您无法继续使用21 ,递归展开并允许您从16的另一条路。 这就是为什么start16

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM