【问题标题】:JavaScript Recursive function > Where is this output value coming from?JavaScript 递归函数 > 这个输出值来自哪里?
【发布时间】:2023-03-18 00:03:02
【问题描述】:

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

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,要么函数根本不起作用。

哪些隐藏的方面正在发挥作用,使这个返回期望值?

【问题讨论】:

  • 是什么让 this 返回所需的值 是......return 声明
  • 不要在这里等待很好的解释,而是去看一些关于递归的视频并尝试理解它,然后再看看你的例子。您可能需要一些时间才能掌握它,但最终您会明白的。

标签: javascript function recursion syntax


【解决方案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))

【讨论】:

  • 这绝对有助于阐明函数的作用,谢谢。
【解决方案2】:

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

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

...当数组没有元素时启动:在这种情况下,总和确实为零。

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

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

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

【讨论】:

    【解决方案3】:

    在第一个循环中调用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

    【讨论】:

    • 对于像我这样的新手来说,这真是一个很好的解释。我没有考虑每次迭代传递的所有数据,所以这很有帮助。
    猜你喜欢
    • 2010-09-27
    • 2017-09-30
    • 2020-03-27
    • 2016-04-16
    • 2017-06-04
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多