Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有人能解释一下这个递归代码是如何工作的吗?_Javascript_Recursion_Stack - Fatal编程技术网

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

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。为什么会这样

这是来自雄辩的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。为什么会这样?我在代码中看不到任何会让它倒下的东西。它重复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
    ...
    ...