代码之家  ›  专栏  ›  技术社区  ›  Rammah_N

我不能正确理解递归函数是如何工作的

  •  -1
  • Rammah_N  · 技术社区  · 6 年前

    function rangeOfNumbers(startNum, endNum) {
      console.log(`called with start: ${startNum} end: ${endNum}`)
      if (startNum === endNum) return [startNum];
      else if (startNum > endNum) return;
      else {
        let arr = rangeOfNumbers(startNum + 1, endNum);
        arr.unshift(startNum);
        return arr;
      }
    };
    
    console.log(rangeOfNumbers(0, 4))

    因此,在(let arr)部分返回一个带有[startNum]的数组之后,(startNum)等于4,即(endNum)(从我最初设置的条件开始),从那里(startNum)开始减少1,从3开始,直到(startNum)我设置为参数(0)。这到底是怎么发生的?是什么让它每次都减少?

    0 回复  |  直到 6 年前
        1
  •  -1
  •   Heretic Monkey    6 年前

    startNum 一次一个 结果

    1. 呼叫 rangeOfNumbers(4, 4) 退货 [4]
    2. 呼叫 rangeOfNumbers(3, 4) 接收 [4] 从步骤1添加 3 unshift ).
    3. 呼叫 rangeOfNumbers(2, 4) 接收 [3,4] 从步骤2添加 2
    4. rangeOfNumbers(1, 4) [2,3,4] 从步骤3添加 1 到数组的开头
    5. 呼叫 rangeOfNumbers(0, 4) 接收 [1,2,3,4] 0 到数组的开头
    6. 就这样。。。

    function rangeOfNumbers(startNum, endNum) {
      if (startNum === endNum) {
        let arr = [startNum];
        console.log('result of call with startNum:', startNum, ', endNum:', endNum, arr);
        return arr;
      } else if (startNum > endNum) { 
        return; 
      } else {
        let arr = rangeOfNumbers(startNum + 1, endNum);
        console.log('result of recursive call with startNum + 1:', startNum + 1, ', endNum:', endNum, arr);
        arr.unshift(startNum);
        console.log('after adding startNum to beginning of array:', startNum, arr);
        console.log('result of call with startNum:', startNum, ', endNum:', endNum, arr);
        return arr;
      }
    };
    
    console.log('final result', rangeOfNumbers(0, 4));
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        2
  •  1
  •   DCR    6 年前

    ron(0,4)
       ron(1,4)
          ron(2,4)
            ron(3,4)
               ron(4,4)
    

    地址:

    ron(4,4) it returns 4