【问题标题】:How this function execute in details?这个函数如何详细执行?
【发布时间】:2020-04-28 02:51:11
【问题描述】:

我不明白这个函数是如何执行的。有人可以向我解释一下吗?我理解第一步:如果 n<=0 然后函数停止执行。

function sum(arr, n) {
  if (n <= 0) {
    return arr[0];
  } else {
    return sum(arr, n - 1) + arr[n];
  }
}

console.log(sum([2, 3, 4], 1));

为什么结果是 5?我想请人解释一下函数是如何执行的。

【问题讨论】:

  • 函数执行两次,n = 1(初始值)和 n = 0。因此它递归地对数组的第 0 和第 1 个元素求和,即 2 + 3 = 5。跨度>
  • sum([2,3,4],1) = sum([2,3,4], 0) + [2,3,4][1] = [2,3,4][0] + [2,3,4][1] = 2 + 3 = 5

标签: javascript function recursion


【解决方案1】:

这是关于递归的好读物https://www.hackerearth.com/practice/notes/demystifying-recursion-by-stack-tracing/

    if (n <= 0) {
        return arr[0]; //that is 2
    } else {
        //sum([2,3,4], 1-1 ) + arr[1] that is 3; //for the first time
        return sum(arr, n - 1) + arr[n];
    }
}

在上述情况下,sum([2,3,4] , 1) 的第一次调用会将 arr[1] 的值保存在堆栈中,即 3。在递归调用之后,n 的下一个值将是 0,它将返回 arr[0],即 2 和在弹出时它会添加值,结果将为 5。

【讨论】:

    【解决方案2】:

    这将递归调用sum 函数并将arr[n]arr[0] 的所有数字相加。

    我们可以简单地替换和展开(有效的)函数调用来检查发生了什么:

    sum([2, 3, 4], 1)
    

    执行将转到函数的else 分支,因为n &lt;= 0false,所以如果我们替换为该代码,我们会得到:

    sum(arr, n - 1) + arr[n]
    

    由于我们有arr(它是[2, 3, 4])和n(这是1)的值,我们也可以替换它们:

    sum([2, 3, 4], 1 - 1) + [2, 3, 4][1]
    

    现在,让我们再次展开函数调用。有效调用是sum([2, 3, 4], 0),所以这次代码将进入if 分支,因为n &lt;= 0true,我们得到:

    [2, 3, 4][0] + [2, 3, 4][1]
    

    我还将 arr[0] 中的 arr 替换为我们的参数。

    没有更多对sum 的递归调用,所以我们完成了展开。

    现在,我们简单计算一下 - [2, 3, 4] 的第 0 个元素是什么,[2, 3, 4] 的第一个元素是什么:

    2 + 3
    

    最后,简单的加法给我们5

    如果它更容易阅读,这里的递归变成了一个直接循环,同时仍然接近递归控制流:

    function sum(arr, n) {
      let total = 0;
      while (true){
        if (n <= 0) {
          total += arr[0];
          
          return total;
        } else {
          total += arr[n];
          n -= 1;
        }
      }
    }
    
    console.log(sum([2, 3, 4], 1));

    【讨论】:

      【解决方案3】:

      这是递归函数,为了了解结果,您必须跟踪代码并检查 STACK CALL 结果;

      注意:由于有return语句,因此代码中不需要if else,首先if就足够了 您在第一次调用时再次调用 sum 并具有值 arr[1] = 3,然后在下一次调用堆栈中 sum 函数具有 sum([2,3,4], 0),因为 n = 0,然后它将 return arr[0] 等于 2;最终结果将是 2 + 3 = 5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多