Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二进制递归错误消息:StackOverflowerError_Java_Recursion - Fatal编程技术网

Java 二进制递归错误消息:StackOverflowerError

Java 二进制递归错误消息:StackOverflowerError,java,recursion,Java,Recursion,当我运行下面的程序时,我得到以下错误:(有什么想法吗?) 下面是代码:我需要生成一个随机整数数组,并使用二进制和线性递归将其值相加 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; in

当我运行下面的程序时,我得到以下错误:(有什么想法吗?)


下面是代码:我需要生成一个随机整数数组,并使用二进制和线性递归将其值相加

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);
    }
}
import java.io.*;
导入java.util.ArrayList;
导入java.util.Random;
类SumArray{
静态内部楼层=100000;
静态int ceil=0;
int结果;
半整数;
int-half2;
//线性递归
整数和(整数a[],整数n){
如果(n==1)
返回[0];
否则{
结果=总和(a,n-1);
结果=结果+a[n-1];
返回结果;
}
}
//二元递归
整数二进制和(整数a[],整数i,整数n){
如果(n==1)
返回[0];
返回二进制和(a,i,ceil/2)+二进制和(a,i+ceil/2,floor/2);
}
公共静态void main(字符串args[])引发IOException{
//定义ArrayList以保存整数对象
ArrayList编号=新的ArrayList();
//用户确定元素的数量
DataInputStream dis=新的DataInputStream(System.in);
System.out.println(“您好!请输入数组的大小:”);
int n=Integer.parseInt(dis.readLine());
//生成指定数量的随机整数
Random randNumGenerator=新的Random();
int[]x=新的int[n];
//仍然小于指定的数字。请添加更多
对于(int i=0;ix[i]){
地板=x[i];
}
}
SumArray a1=新的SumArray();
//打印数组值
System.out.println(“数组值包括:“+数字”);
//打印总数
System.out.println(“使用线性递归的数组的和是:”+a1.sum(x,n));
//打印二进制和
System.out.println(“使用二进制递归的数组的和是:”+a1.binarySum(x,n,n));
系统输出打印项次(“天花板:+ceil”);
System.out.println(“地板:+地板”);
}
}

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

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

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

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


提示:在打印所有相关变量的
binarySum
开头插入
System.out.println
。您将很快发现问题所在。

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

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


提示:在打印所有相关变量的
binarySum
开头插入
System.out.println
。您将很快发现问题所在。

您正在递归调用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));
  }
}

对于每个调用,我们将正在搜索的内容分成两半并递归,直到找到单个项为止

您正在递归调用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));
  }
}

对于每个调用,我们将正在搜索的内容分成两半并递归,直到找到单个项为止

提示:放入一些诊断以显示每个递归调用的参数。然后考虑一下
binarySum(anything,anything,0)
将做什么……提示:放入一些诊断以显示每个递归调用的参数。然后想想
binarySum(任何,任何,0)
能做什么。。。