使用递归

Ala*_*rds 0 javascript recursion

我在 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
Run Code Online (Sandbox Code Playgroud)

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

ZER*_*ER0 5

实际上,等于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: }
Run Code Online (Sandbox Code Playgroud)

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

sum([2, 3, 4], 1)
Run Code Online (Sandbox Code Playgroud)

该函数通过equals to和equals tosum调用。arr[2, 3, 4]n1

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

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

所以我们sum再次调用,这次 with arrequals to[2, 3, 4]但 with nequals to 0。从n此时起0,在第2 行检查,我们继续执行第 3 行并返回0

现在,函数退出,并带有0我们提供给调用者的值。

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

5:    return sum(arr, n - 1) + arr[n - 1];
Run Code Online (Sandbox Code Playgroud)

既然它返回了0,我们可以像这样成像:

5:    return 0 + arr[n - 1];
Run Code Online (Sandbox Code Playgroud)

请记住,n所以1

5:    return 0 + arr[0];
Run Code Online (Sandbox Code Playgroud)

因为arr[0]等于2

5:    return 0 + 2;
Run Code Online (Sandbox Code Playgroud)

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

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