在 JavaScript 中递归计算整数数组的总和

Posted

技术标签:

【中文标题】在 JavaScript 中递归计算整数数组的总和【英文标题】:Recursively calculate the sum of an Array of integers in JavaScript 【发布时间】:2018-12-10 00:25:46 【问题描述】:

我想编写一个 javascript 程序来计算整数数组的总和递归

预期结果

输入:[1、2、3、4、5、6] 输出:21

我用这段代码实现了上述结果:

function calculateSum(array) 
    if (array instanceof Array)
        if (!array.some(isNaN)) 
            var total = 0;

            array.forEach(function (value) 
                total += value;
            );

            return total;
        
        return "Provide an Array with only Numeric Values";
    

    return "Please provide an Array";

但我正在寻找使用递归的解决方案。

编辑:我开始做上述练习来练习递归。我很难弄清楚这一点。所以,这就是我发布这个的原因。如果你能理解我会很高兴。

提前致谢。

【问题讨论】:

你试过什么?您具体需要哪些帮助? @Carcigenicate 我想要一个使用递归的解决方案 是的。你被困在哪里了?要求提供完整的解决方案过于宽泛。展示您的尝试并就您遇到的问题提出具体问题。 .reduce() 可以轻松做你想做的事情时,为什么要递归? 【参考方案1】:

常量数组 = [1, 2, 3, 4, 5, 6] //sum(array) // 返回 21

function sum(array) 
    if (array.length == 1) 
        return array[0] // base case (exist condition)
    
    else
        return array[0] + sum(array.slice(1))  // recursion starts
    

    

console.log(sum(array)

【讨论】:

【参考方案2】:
    package Map;
    import java.util.Scanner;
    public class Practice6  
        public int sum(int [] temp)
            if(temp.length>0) 
                int value = 0;
                for (int i = 0; i < temp.length; i++) 
                    value += temp[i];
                
                return value;
            return 0;
        
        
        public static void main(String[] args) 
            Scanner sc= new Scanner(System.in);
            System.out.println("Enter the array: ");
            int x= sc.nextInt();
            int [] data= new int[x];
            for(int m=0; m<data.length;m++)
                System.out.println("Enter the number "+m);
                data[m]= sc.nextInt();
            
            Practice6 practice6= new Practice6();
            System.out.println(practice6.sum(data));
        
    

【讨论】:

写一个函数来求一个数组的总和。使您的函数递归。 sum([1, 2, 3, 4]) ➞ 10 工作正常。试试看 这不使用递归,不是用 JavaScript 编写的,也没有展示任何针对该问题的最佳实践。【参考方案3】:
this is a more beginner-friendly solution :) 

// 2. Compute the sum of an array of integers.



var sum = function (array) 
  var total = 0;
  for (var n = 0; n < array.length; n++) 
    // terminating case
    if (n === array.length - 1) 
      //   console.log('last', total, array[n]);
      total = total + array[n];
     else 
      // recursive case
      //   console.log('befoer ', total, array[n]);
      total = total + array[n] + sum(array[n + 1]);
    
  
  return total;
;
sum([1,2,3,4,5,6]); // 21

【讨论】:

【参考方案4】:
var numbers= [1,2,3,4,5,6];
sum=0;
function x(a,b)
  return a+b;

for (a in numbers) 
 sum = x(numbers[a],sum);
 console.log(sum);

祝你好运

【讨论】:

【参考方案5】:

解构语法允许优雅的函数式表达

const None =
  Symbol ()

const sum = ([ n = None, ...rest ]) =>
  n === None
    ? 0
    : n + sum (rest)

console.log
  ( sum ([])               // 0
  , sum ([ 1 ])            // 1
  , sum ([ 1, 2 ])         // 3
  , sum ([ 1, 2, 3 ])      // 6
  , sum ([ 1, 2, 3, 4 ])   // 10
  )

【讨论】:

【参考方案6】:
var arr = [1, 2, 3, 4, 5];

function add(arr) 
    if(arr.length>1) 
      arr[0] += arr.splice(1,1)[0];
      return add(arr);
     else
      return arr[0];

【讨论】:

【参考方案7】:

递归其实是一个回归问题, 如果名为“Arr”的数组只有一个元素 - 这是总和, 现在假设您知道 N 个元素数组的求和公式,

您现在可以使用递归来求 (N+1) 个元素数组的总和,因为 它只是最后一个元素加上你已经知道/计算的前一个 N 的总和。

附上一个例子。 在wikipedia 阅读更多内容。

let arr = [10,100,1000,10000];
function sum(array)
  if(array.length === 1)
    return array[0];
  else
    return array[array.length-1] + sum(array.slice(0,array.length-1));
  


console.log(sum(arr));

【讨论】:

【参考方案8】:

要使用递归,您只需要一个基本情况和方法将输入溢出到可以递归的更小的东西中。

长度为 1 的数组的总和就是 arr[0] 对吧?所以这是一个合理的基本情况。对于更大的数组,总和是一个元素加上所有其他元素的总和。这就是你的另一种情况:arr[0] + sum(everything else)

现在您可以只用这两种情况编写一个简单的函数:

let arr = [1, 2, 3, 4, 5, 6] 

function add(arr) 
    if (arr.length == 1) return arr[0] // base case
    return arr[0] + add(arr.slice(1))  // recurse

console.log(add(arr))

这个想法很简单,您可以将其表达为单行:

const add = (arr) =>  arr.length == 1 ?  arr[0] : arr[0] + add(arr.slice(1))
console.log(add([1, 2, 3, 4, 5, 6] ))

当然,您可能想要更好的错误检查,但这应该可以帮助您入门。

【讨论】:

谢谢!这正是我一直在寻找的。 ?

以上是关于在 JavaScript 中递归计算整数数组的总和的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的递归函数

整数数组和的分治算法

二维数组中所有岛屿之间的最大总和是多少?必须使用递归

如何计算整数中递归地与给定数字相加的数字对

如何计算数组中对象键的总和 - javascript

查找没有溢出的整数数组的总和