BinaryRecursion错误消息:StackOverflowError

时间:2011-11-27 09:59:12

标签: java recursion

当我运行以下程序时,我收到以下错误:(任何想法?)

Exception in thread "main" java.lang.StackOverflowError
at SumArray.binarySum(SumArray.java:31)
at SumArray.binarySum(SumArray.java:34)

这是代码:我需要生成一个随机整数数组,并使用二进制和线性递归来添加其值......

import java.io.*;
import java.util.ArrayList;
import java.util.Random;

class SumArray {
    static int floor = 100000;
    static int ceil = 0; 
    int result;
    int half; 
    int half2;

    //Linear Recursion
    int sum(int a[], int n) {
        if (n == 1)
            return a[0];
        else {
            result = sum(a, n - 1);
            result = result + a[n - 1];
            return result;
        }
    }

    //Binary Recursion
    int binarySum(int a[], int i, int n) {
        if (n == 1)
            return a[0];

        return binarySum(a, i, ceil/2) + binarySum(a, i + ceil/2, floor/2);
    }

    public static void main(String args[]) throws IOException {

        //Define ArrayList to hold Integer objects
        ArrayList<Integer> numbers = new ArrayList<Integer>();

        // User determines number of elements
        DataInputStream dis = new DataInputStream(System.in);
        System.out.println("Hello! Please enter the size of your array: ");
        int n = Integer.parseInt(dis.readLine());

        // Generate specified number of random integers
        Random randNumGenerator = new Random();
        int[] x = new int[n];

        // While still less than indicated number.. add more
        for (int i = 0; i < x.length; i++) {
            x[i] = (randNumGenerator.nextInt(100000));
            numbers.add(x[i]);

            //calculate min and max values
            if(ceil < x[i]) {
                ceil = x[i];
            }
            if(floor > x[i]) {
                floor = x[i];
            }
        }

        SumArray a1 = new SumArray();

        // Print array values
        System.out.println("Array values inlude: " + numbers);

        // Print the sum
        System.out.println("The sum of the array using Linear Recursion is: " + a1.sum(x, n));

        // Print the binary sum
        System.out.println("The sum of the array using Binary Recursion is: " + a1.binarySum(x, n, n));

        System.out.println("Ceiling: " + ceil);
        System.out.println("Floor: " + floor);
    }
}

3 个答案:

答案 0 :(得分:2)

你递归调用你的BinarySum方法,它的第三个参数为ceil / 2,而floor / 2则永远不会改变。 ceil / 2为0,floor / 2为50000,这些都不是1,所以你得到无限递归。看起来你可能希望每个递归调用的值都不同......

我的Java有点生疏(也许更习惯用Java编码的人可以清理它),但作为一个例子,尝试这样的事情:

class Accumulator {
  static int binarySum(int a[]) {
    return binarySum(a, 0, a.length-1);
  }

  static int binarySum(int a[], int s, int e) {
    if (e-s == 0) return a[s];
    int mid = s + ((e-s)/2);
    return binarySum(a, s, mid) + binarySum(a, mid+1, e);
  }

  public static void main(String args[]) {
    int[] vals = {2,3,4,5,6,7};
    System.out.println(binarySum(vals));
  }
}

对于每次通话,我们将我们正在搜索的内容分成两半并递归,直到我们找到一个项目。

答案 1 :(得分:1)

在二进制和中,如果n == 0,您将继续无限递归,并最终耗尽堆栈空间。尝试修复它,看它是否有帮助。祝你好运!

答案 2 :(得分:0)

binarySum获取参数n,该参数未在函数内使用。因此,您的递归不会将工作分成两部分,因此永远不会结束。

另外:您正在将数组索引(ni)与数组的内容混合(ceilfloor)。这也是完全错误的。

提示:在System.out.println的开头插入binarySum,打印出所有相关变量。你很快就会发现什么是错的。