下面的简单函数接收一个数组和一个数字,并从本质上输出该数组的长度*指定的数字。
function sum(arr, n) {
if (n <= 0) {
return 0;
} else {
return sum(arr, n - 1) + arr[n - 1];
}
}
如果调用以下命令:sum([2, 3, 4, 5], 3)
,我们将正确获得9作为最终输出值。例如:
function sum(arr, n) {
if (n <= 0) {
return 0;
} else {
return sum(arr, n - 1) + arr[n - 1];
}
}
console.log(sum([2, 3, 4, 5], 3))
虽然不确定我了解这里发生了什么。此最终值存储在哪里?我可以看到,在函数中调用该函数并在每个实例中使用递减的值实质上是在替换for循环,但是如果没有其他上下文,我希望输出始终返回0或该函数完全不起作用。
哪些隐藏方面正在发挥作用,以使此返回所需的值?
您可以添加记录器并观看算法的工作。
function sum(arr, n) {
if (n <= 0) {
return 0;
} else {
console.log(n, arr[n - 1]);
return sum(arr, n - 1) + arr[n - 1];
}
}
console.log(sum([2, 3, 4, 5], 3))
没有隐藏的方面。这是递归的经典示例。它具有基本情况:
if (n <= 0) {
return 0;
}
...在没有元素的数组中插入:在那种情况下,总和确实为零。
并且当数组具有一个或多个元素时,它具有递归的情况:
else {
return sum(arr, n - 1) + arr[n - 1];
}
这里我们解决了一个较短数组的问题(因此n - 1
),并假设其结果正确,我们只需要对遗漏的值add进行arr[n - 1]
。不一定为零。当数组的大小为1时,我们在这里得到0 + arr[0]
。
在调用sum([2, 3, 4, 5], 3)
的第一个循环中那么您的函数将返回以下内容sum([2,3,4,5], 2) + 4
在第二个循环中,当您调用sum([2, 3, 4, 5], 2)
时(在第一个循环中返回)那么您的函数将返回以下内容sum([2, 3, 4, 5], 1) + 3
在第三个循环中,当您调用sum([2, 3, 4, 5], 1)
时(在第二个循环中返回)那么您的函数将返回以下内容sum([2, 3, 4, 5], 0) + 2
在调用sum([2, 3, 4, 5], 0)
的第四个循环中(在第三个循环中返回)那么您的函数将返回以下内容0
非常有效,就好像您要返回0 + 2 + 3 + 4