【问题标题】:Recursion Explained递归解释
【发布时间】:2022-01-18 23:49:56
【问题描述】:

生成数组中前 n 个值的总和。

function sum(arr, n) {
  
  if (n <= 0 ){
    return 0;
  } else { 
    return sum(arr, n-1) + arr[n-1];
  }
 }

你好,我有这个来自 freecodecamp 的简单递归函数。我理解递归的概念,但我似乎无法理解为什么它在这个确切的用例中有效。

我主要是在努力理解计数是如何增加和存储以产生最终总和的,以及为什么函数在到达断点后不返回 0 作为总和。

感谢任何解释,谢谢。

这也不是针对项目或任何类型的,只是为了更好地理解这个概念。

【问题讨论】:

  • "为什么函数在到达断点后不返回 0 作为总和。" - 什么断点?
  • “计数如何增加” - 计数没有增加,n 的值随着每个可重入步骤(也称为递归调用)而减少。
  • @Dai,当n = 0时,函数命中第一个子句。可以将其描述为循环的中断。
  • 欢迎您,格里芬。请参阅How to Ask 并拨打tour。您的问题有点宽泛,因为我们不是讨论论坛。如果可以,请修改以询问有关该代码的更具体的内容。
  • 这可能是开始使用调试器的好机会。使用调试器,您可以在代码执行时逐行单步执行代码,单步执行此函数的每个递归调用,并观察其行为方式和值如何变化。当你这样做时,你能确定一个不符合你期望的特定操作吗?那是什么手术?使用了哪些值?结果如何?预期的结果是什么?为什么?

标签: javascript recursion


【解决方案1】:

将每个递归调用视为在堆栈上添加一个框架。在计算当前帧的答案之前,所有被调用的帧都必须给出答案。

调用程序启动:

FRAME_A
sum([5,7,10],3)
n <= 0: False
answer here = sum([5,7,10],2) + 10
              ^
             wait for this to be computed
             let's call this WAIT_A

--------
FRAME_B
sum([5,7,10],2)
n <= 0: False
answer here = sum([5,7,10],1) + 7
                ^
                wait for this to be computed
                let's call this WAIT_B

---------
FRAME_C
sum([5,7,10],1)
n <= 0: False
answer here = sum([5,7,10],0) + 5
                ^
                wait for this to be computed
                let's call this WAIT_C
---------
FRAME_D
sum([5,7,10],0)
n <= 0: True
return 0
FRAME_D is done.
(Now, we are rolling back)

WAIT_C is now 0. FRAME_C answer is 0 + 5 = 5. FRAME_C is done.
WAIT_B is now 5. FRAME_B answer is 5 + 7 = 12. FRAME_B is done.
WAIT_A is now 12. FRAME_A answer is 12 + 10 = 22. FRAME_A is done.
All frames are done. Final answer = 22.

【讨论】:

  • 谢谢,以这种方式看到它更有意义。感谢您的帮助。
猜你喜欢
  • 2022-01-11
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2019-03-31
  • 2016-06-27
  • 2016-05-08
相关资源
最近更新 更多