JavaScript递归函数>此输出值来自哪里?

问题描述 投票:1回答:3

下面的简单函数接收一个数组和一个数字,并从本质上输出该数组的长度*指定的数字。

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或该函数完全不起作用。

哪些隐藏方面正在发挥作用,以使此返回所需的值?

javascript function recursion syntax
3个回答
1
投票

您可以添加记录器并观看算法的工作。

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))

1
投票

没有隐藏的方面。这是递归的经典示例。它具有基本情况

if (n <= 0) {
    return 0;
}

...在没有元素的数组中插入:在那种情况下,总和确实为零。

并且当数组具有一个或多个元素时,它具有递归的情况

else {
    return sum(arr, n - 1) + arr[n - 1];
}

这里我们解决了一个较短数组的问题(因此n - 1),并假设其结果正确,我们只需要对遗漏的值add进行arr[n - 1]。不一定为零。当数组的大小为1时,我们在这里得到0 + arr[0]


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

© www.soinside.com 2019 - 2024. All rights reserved.