递归地对数组中的整数求和

时间:2013-11-27 21:43:59

标签: java arrays recursion sum

我有一个程序,我正在尝试为类返回使用递归返回数组中所有整数的总和。这是我迄今为止的计划:

public class SumOfArray {

private int[] a;
private int n;
private int result;

    public int sumOfArray(int[] a) {

      this.a = a;
      n = a.length;

      if (n == 0)  // base case
      result = 0;
      else
          result = a[n] + sumOfArray(a[n-1]);

      return result;

   } // End SumOfArray method

} // End SumOfArray Class 

但我相信,我得到的三个错误都是相关的,但是我无法弄清楚为什么它会找到一种null:

SumOfArray.java:25: sumOfArray(int[]) in SumOfArray cannot be applied to (int)
    result = a[n] + sumOfArray(a[n-1]);
                    ^
SumOfArray.java:25: operator + cannot be applied to int,sumOfArray
    result = a[n] + sumOfArray(a[n-1]);
              ^
SumOfArray.java:25: incompatible types
found   : <nulltype>
required: int
    result = a[n] + sumOfArray(a[n-1]);
                  ^
3 errors

9 个答案:

答案 0 :(得分:14)

解决方案比它看起来更简单,试试这个(假设一个长度非零的数组):

public int sumOfArray(int[] a, int n) {
    if (n == 0)
        return a[n];
    else
        return a[n] + sumOfArray(a, n-1);
}

这样称呼:

int[] a = { 1, 2, 3, 4, 5 };
int sum = sumOfArray(a, a.length-1);

答案 1 :(得分:5)

问题是a[n-1]int,而sumOfArray期望数组 int

提示:您可以通过使sumOfArray获取数组和起始(或结束)索引来简化操作。

答案 2 :(得分:3)

a[n-1] 

是在n-1处得到int,而不是从0到n-1的数组。

尝试使用

Arrays.copyOf(a, a.length-1);

代替

答案 3 :(得分:1)

a是一个int数组。因此a[n-1]int。您正在将int传递给sumOfArray,而int需要一个数组,而不是{{1}}。

答案 4 :(得分:1)

如果您不想传递数组的长度,请尝试此操作:

private static int sumOfArray(int[] array) {

        if (1 == array.length) {
            return array[array.length - 1];
        }

        return array[0] + sumOfArray(Arrays.copyOfRange(array, 1, array.length));
    }

当然你需要检查数组是否为空。

答案 5 :(得分:1)

这是一个复杂度为O(N)且仅带输入参数A []的递归解决方案。
你可以处理null和empty(0 length)case,特别是它在这个解决方案中返回0。在这种情况下你也会抛出异常。

/*
 * Complexity is O(N)
 */
public int recursiveSum2(int A[])
{
    if(A == null || A.length==0)
    {
        return 0;
    }
    else
    {
        return recursiveSum2Internal(A,A.length-1);
    }
}
private int recursiveSum2Internal(int A[],int length)
{
    if(length ==0 )
    {
        return A[length];
    }
    else
    {
        return A[length]+recursiveSum2Internal(A, length-1);
    }
}

答案 6 :(得分:1)

这种递归解决方案怎么样?您创建一个较小的子数组,其中包含从第二个到最后的元素。此递归将继续,直到数组大小变为1。

import java.util.Arrays;

public class Sum {
    public static void main(String[] args){
        int[] arr = {1,2,3,4,5};
        System.out.println(sum(arr)); // 15
    }

    public static int sum(int[] array){
        if(array.length == 1){
            return array[0];
        }

        int[] subArr = Arrays.copyOfRange(array, 1, array.length);
        return array[0] + sum(subArr);
    }
}

答案 7 :(得分:0)

private static int sum(int[] arr) {
    // TODO Auto-generated method stub
    int n = arr.length;

    if(n==1)
    {
        return arr[n-1];
    }

    int ans = arr[0]+sum(Arrays.copyOf(arr, n-1));

    return ans;
}

答案 8 :(得分:0)

简化版:

//acc -> result accumlator, len - current length of array

public static int sum(int[] arr, int len, int acc) {
    return len == 0 ? acc :  sum(arr, len-1,  arr[len-1]+ acc); 
}   
public static void main(String[] args)  {
    int[] arr= { 5, 1, 6, 2};
    System.out.println(sum(arr, arr.length, 0));
}