【问题标题】:Using recursion to return the sum of the first n elements of an array arr使用递归返回数组 arr 的前 n 个元素的总和
【发布时间】:2021-07-23 16:27:08
【问题描述】:

我正在尝试从 freecodecamp.org 学习一些 JavaScript,但偶然发现了一个我无法解决的递归问题:

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

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

我明白了第二部分:arr[n -1] 添加项目值

但我不明白第一部分(sum(arr, n-1)) 做了什么,以及 arr 参数如何反应。

谁能帮忙?

感谢任何帮助!

【问题讨论】:

  • 想象你有一个数组 [1,2,3,4,5],n = 3,所以你调用函数来创建堆栈,通过添加 arr[n-1],所以它是 1 step) + 3 2 step) +2 3 step) +1 然后你加 0,当 n=0 但你不明白的第一部分是通过递归 sum(arr, n - 1) 调用函数,所以你调用函数递减N。
  • 如果你打电话给sum(arr, 3),那么sum(arr, n - 1) + arr[n - 1] -> sum(arr, 2) + arr[2]。所以前3个元素的总和可以计算为前2个元素的总和加上第三个元素的值。

标签: javascript web recursion


【解决方案1】:

函数式编程很容易追踪,因为每个表达式都可以用其计算结果替换。所以遇到sum(arr, n - 1)之类的东西,就填n - 1,重新计算函数。

例如,sumarr 的第一个 5 元素

sum(arr, 5)
   \
  sum(arr, 4) + arr[4]
     \
    sum(arr, 3) + arr[3]
       \
      sum(arr, 2) + arr[2]
         \
        sum(arr, 1) + arr[1]
           \
          sum(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 算法 -

function fib(n)
{ if (n < 2)
    return n
  else
    return 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)  1    1           0     1            0         
            /         \                                 
           1           0                               

fib(5) = 1 + 0 + 1 + 1 + 0 + 1 + 0 + 1
       = 5

【讨论】:

    【解决方案2】:

    执行此代码时,您会创建一个由 frames 组成的 stack

    每一都是一个函数调用,帧数为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多