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)
能做什么。。。