【问题标题】:Finding the total sum of numbers in an array in Java, recursively递归地在Java中查找数组中数字的总和
【发布时间】:2017-01-18 05:44:43
【问题描述】:

我知道通过迭代而不是递归更容易找到数组中数字的总和,但是如果我要使用递归来编写这样的函数,那么这段代码会有什么问题?

public static double sum (double[] a) {
    if (a.length == 0)
        return 0.0;
    else{
        return sumHelper (a, 1, a[0]);
    }
}
private static double sumHelper (double[] a, int i, double result) {
    if (i < a.length) {
        result = result + sumHelper (a, i + 1, result);
    }
    return result;
}

一切运行都没有错误,但在我测试时没有返回正确的总和。

【问题讨论】:

  • 在每次递归调用中将问题减少一个将导致堆栈大小为 O(n)。如果有任何机会你必须处理大型数组,你最好写sumHelper 来返回一个范围内的总和。如果范围的长度为 1,则返回该元素的值。否则将范围分成两半,在每一半上递归调用sumHelper,并返回结果的总和。这并没有减少工作量,但会给堆栈带来 O(log n) 的增长,并允许您处理更大的数组。

标签: java arrays recursion sum


【解决方案1】:
public class RecursiveSum {
    public static void main(String[] args) {
        System.out.println(sum(new double[] {1,3,4,5}));
    }

    public static double sum(double[] a) {
        if (a.length == 0)
            return 0.0;
        else{
            return sumHelper(a, 0);
        }
    }

    private static double sumHelper(double[] a, int i) {
        if(a.length - 1 == i){
            return a[i];
        }else{
            return  a[i] + sumHelper(a, i + 1);
        }
    }
}

【讨论】:

  • 注意循环不变量
  • 谢谢!正是我想要的。这是一种更好的处理方式,不包括第三个参数。
【解决方案2】:

将 i 的值初始化为 0,因为您传递的是 1。 或者试试这个

public static void main(String args[]){
    double a[]=new double[10];
    a[0]=123;
    a[1]=123;
    a[2]=123;
    a[3]=123;
    a[4]=123;
    a[5]=123;
    a[6]=123;
    a[7]=123;
    a[8]=123;
    a[9]=123;
    System.out.println(sum(a));
}

【讨论】:

  • 我已经用 a[0] 考虑了数组的第一个索引 (0)。因此,我想采用该初始索引,并从 0 之后开始添加每个索引。这就是我将其初始化为 1 的原因。
【解决方案3】:

主方法声明有问题:

public static void main(String args[]){
        double a[]=new double[10];
        a[0]=123;
        a[1]=123;
        a[2]=123;
        a[3]=123;
        a[4]=123;
        a[5]=123;
        a[6]=123;
        a[7]=123;
        a[8]=123;
        a[9]=123;
        System.out.println(sum(a));
    }

【讨论】:

  • 我包含的代码不是整个文件。我确实有不同的数组被初始化以用作测试,以及一个已经正确声明的主要方法。但是,文件的其余部分已经给出,只有我包含的代码片段是我添加到文件中的。我确信问题出在我上面包含的代码中。正如我所说,一切都可以正确编译和运行,我只是得到了与预期不同的结果。例如,当使用包含 -3 和 5 的数组对其进行测试时,总和将为 2,但它返回 -6。
【解决方案4】:

如果您只使用一种方法对数组中的所有数字进行递归求和,那么您会这样做。 公共静态 void main(String[] args) {

      double a[]=new double[6]; //initialize it
        a[0]=1; //fill it with values
        a[1]=2;
        a[2]=3;
        a[3]=4;
        a[4]=5;
        a[5]=6;

        System.out.println(sum(a, a.length-1)); //call the method and print as well

}

public static double sum( double arr[], int n ) { 
      if (n < 0) {
        return 0;
      } else{
        return arr[n] + sum(arr, n-1); //magic 
      }
    }

【讨论】:

  • 谢谢!但是,在这种情况下,我更愿意将其保留为 2 个单独的方法。我知道将其浓缩为 1 种方法会更简单、更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多