Javascript 使用递归返回数组arr的前n个元素之和

Javascript 使用递归返回数组arr的前n个元素之和,javascript,web,recursion,Javascript,Web,Recursion,我试图从freecodecamp.org学习一些JavaScript,但我无意中发现了一个递归问题,我无法理解: 说明:编写一个递归函数sum(arr,n),返回数组arr的前n个元素的和 函数和(arr,n){ 如果(n执行此代码时,您创建了一个由帧组成的堆栈 每帧都是一个函数调用,帧数为n+1 无关:StackOverflow是堆栈大小超出某个限制时发生的常见错误的名称 例如,如果将[1,2,3,4,5,6,7,8,9]和4作为参数传递,则从下到上隐式创建以下堆栈: sum([1, 2, 3

我试图从freecodecamp.org学习一些JavaScript,但我无意中发现了一个递归问题,我无法理解:

说明:编写一个递归函数sum(arr,n),返回数组arr的前n个元素的和

函数和(arr,n){

如果(n执行此代码时,您创建了一个由帧组成的堆栈

每帧都是一个函数调用,帧数为
n+1

无关:StackOverflow是堆栈大小超出某个限制时发生的常见错误的名称

例如,如果将
[1,2,3,4,5,6,7,8,9]
4
作为参数传递,则从下到上隐式创建以下堆栈:

sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 0) // This resolves first as it doesn't need to call sum again: 0
sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 1) // Then this: 0 + 1 = 1
sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 2) // Then this: 1 + 2 = 3
sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 3) // Then this: 3 + 3 = 6
sum([1, 2, 3, 4, 5, 6, 7, 8, 9], 4) // Then you get the final result: 6 + 4 = 10

函数式编程很容易跟踪,因为每个表达式都可以用其求值结果替换。因此,当您遇到诸如
sum(arr,n-1)
之类的问题时,请填写
n-1
,然后重新计算函数

例如,
sum
arr

总和(arr,5)
\
总和(arr,4)+arr[4]
\
总和(arr,3)+arr[3]
\
总和(arr,2)+arr[2]
\
总和(arr,1)+arr[1]
\
总和(arr,0)+arr[0]
\
0
sum(arr,5)=arr[4]+arr[3]+arr[2]+arr[1]+arr[0]+0
= 5 + 4 + 3 + 2 + 1
= 15
这也适用于其他问题,比如经典的
fibonacci
算法-

函数fib(n)
{if(n<2)
返回n
其他的
返回fib(n-1)+fib(n-2)
}
fib(5)
/                           \
fib(4)+fib(3)
/               \                   /     \
fib(3)+fib(2)fib(2)+fib(1)
/     \           /     \            /     \     \      
fib(2)+fib(1)fib(1)+fib(0)fib(1)+fib(0)1
/     \     \      /         \       /          \             
fib(1)+fib(0)1010
/         \                                 
1           0                               
fib(5)=1+0+1+1+0+1+0+1
= 5

想象你有一个n=3的数组[1,2,3,4,5],因此你通过添加arr[n-1]来调用函数,因此它是1步+3步+2步+3步+1,然后当n=0时,你添加0,但你不清楚的第一部分是通过递归和(arr,n-1)调用函数,所以你调用递减N的函数。如果你调用
sum(arr,3)
,那么
sum(arr,N-1)+arr[N-1]
->
sum(arr,2)+arr[2]
。因此前3个元素的和可以计算为前2个元素的和加上第三个元素的值。