【问题标题】:Using Recursion使用递归
【发布时间】:2020-04-14 22:16:10
【问题描述】:

我在 FreeCodeCamp.org 上遇到了这个问题(链接到下面的问题),我想知道是否有人可以帮助我更好地理解为什么在调用 sum([2, 3, 4], 1); 时它等于 2; 我坐下来看了一会儿,但在理解它的工作原理时感到精神上受阻。 简单的开发人员试图理解 Javascript 中的递归。

任何帮助将不胜感激!感谢互联网!

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

这里是问题的链接:https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/replace-loops-using-recursion

【问题讨论】:

  • 在第一次迭代中,sum(arr, n - 1)0,因为 n - 10。而arr[n - 1]2
  • 因为您调用sum 时将1 作为n 的值,所以它只从数组中挑选第一个元素。
  • 相当短的第一次递归以 n==0 结束,并且还返回零加上第一个数组元素,因此 0+2。

标签: javascript recursion


【解决方案1】:

实际上,n 等于 1 非常简单。让我们一步一步检查。这是你的sum 函数;让我们添加一些行以便于参考:

1: function sum(arr, n) {
2:  if(n <= 0){
3:    return 0;
4:  }else {
5:    return sum(arr, n - 1) + arr[n - 1];
6:  }
7: }

现在,让我们一步一步看看执行时发生了什么:

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

函数sum被调用,arr等于[2, 3, 4]n等于1

由于n不小于或等于0(第2行),我们转到else块,在5行。

现在,这里是递归发生的地方:我们再次调用函数sum,传递相同的arr,但不是相同的n,而是传递n - 1

所以我们再次调用sum,这次arr 等于[2, 3, 4],但n 等于0。 由于这次n0,在第2 行 检查我们继续第3 行 并返回0

现在,函数退出,我们将值 0 提供给调用者。

sum([2, 3, 4], 0) 的调用者是执行sum([2, 3, 4], 1),特别是在第5行

5:    return sum(arr, n - 1) + arr[n - 1];

由于它返回0,我们可以像这样成像:

5:    return 0 + arr[n - 1];

记住n1,所以:

5:    return 0 + arr[0];

由于arr[0] 等于2

5:    return 0 + 2;

那么为什么sum([2, 3, 4], 1) 返回2

我不确定现在是否更清楚了,但我希望如此。 :)

【讨论】:

    【解决方案2】:

    sum(arr, n) 是一个递归函数,它返回数组 arr 的第一个 n 元素的总和。

    在您的示例中,您提供sum([2, 3, 4], 1),它基本上表示,计算第一个元素的总和(即,本示例中n 的值是1)。

    所以它会像这样通过函数......

    // the first time through 
    function sum([2, 3, 4], 1) {
      if(1 <= 0){ // false this time
        return 0; 
      }else { // this is where we end up
        return sum([2, 3, 4], 0) + 2; // sum will be the result of the recurse back into the function, plus 2
      }
    }
    
    // the second time through 
    function sum([2, 3, 4], 0) {
      if(0 <= 0){ // true this time 
        return 0; // send this result back up to the first run through
      }else {
        // not relevant this time
      }
    }
    
    // back in the the first time through, 
    // we now have a value to work with below
    // remember, this isn't the 'third' time through,
    // it is back in the first time run through
    // just re-printed here so you could see 
    // where the value gets returned from the second run
    function sum([2, 3, 4], 1) {
      if(1 <= 0){ // false this time
        return 0; 
      }else { // this is where we end up
        return sum(0 + 2); // we got a result from the second run through, sum is now 2
      }
    }
    

    【讨论】:

    • 仅供参考,顺便说一句...一些人可以用来帮助他们理解递归可视化的巧妙技巧是首先找到端点,然后按照自己的方式工作回溯到最初的调用。即这个递归循环什么时候结束?对,明白了,好吧,让我们从那里迭代回来。执行此操作时,请在旁边写一个粗略的记录来跟踪结果,以观察正在发生的事情。
    【解决方案3】:

    sum(arr, 1-1) 的计算结果为 0,因为 if 语句检查 n 是否为

    arr[n-1] 等于 2,因为您实际上是在尝试访问 arr[1-1],即 arr[0]

    因此,它返回 2,因为 return sum(arr, n-1) + arr[n-1]; 的计算结果为 2。

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2020-12-02
      • 2018-03-26
      • 2011-09-04
      • 2013-02-16
      相关资源
      最近更新 更多