为什么当字长超过 4 时此代码会出现计算器错误?
why does this code gives stackoverflow error when word length is beyond 4?
我已经编写了一个代码来生成一个单词的所有可能的字母组合,而不重复任何字母或任何特定单词。代码如下
static boolean redcheck(int array[])// checks if letters are repeated
{
boolean check=true;
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]==array[j])
{
check=false;
break;
}
}
}
return check;
}
static void repeat(char arr2[],int arr1[],int p)// creates and prints the word
{
if(redcheck(arr1))
{
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
for(int i=0;i<p;i++)
System.out.print(arr1[i]);
System.out.println();
}
arr1[p-1]+=1;
for(int ini=p-1;ini>0;ini--)
{
if(arr1[ini]>p-1)
{
arr1[ini-1]+=1;
arr1[ini]=0;
}
}
if(arr1[0]>p-1)
return;
repeat(arr2,arr1,p);
}
public static void main()
{
Scanner sc=new Scanner(System.in);
System.out.println("enter word");
String a=sc.nextLine();
int num=a.length();
char arr[]=new char[num];
for(int c=0;c<a.length();c++)
arr[c]=a.charAt(c);
int arr1[]=new int[num];
for(int i:arr1)
arr1[i]=0;
repeat(arr,arr1,num);
}
代码在任何长度为 4 的单词之前都可以正常工作,但是当它超过 4 时,它会抛出堆栈溢出错误。经过一些检查,造成问题的主要代码部分是打印部分本身,即
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
我真的找不到我哪里出错了。上面提到的下面的 print 语句按单词的打印顺序打印单词的索引,并且不会给出任何错误。
我正在使用 bluej 编辑器,看起来我有 512MB 的堆栈内存。
请提前help.thanks
编辑:错误代码是
java.lang.WhosebugError:
空
有 4 个字母(假设 none 个相同),这些字母有 4^4 = 256 种可能的组合。由于您的代码当前已设置,您将至少递归 256 次,然后返回一个值,这将在您的堆栈上占用大量内存。如果您尝试扩大到 5 个字母(再次假设 none 相同),您将有 5^5 = 3125 种可能的组合,等等......
您收到的堆栈溢出错误是由于您递归的时间长短所致。
我的建议:
将你的 repeat 方法分成两部分:
static void printWord(char arr2[],int arr1[],int p) {
if(redcheck(arr1))
{
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
for(int i=0;i<p;i++)
System.out.print(arr1[i]);
System.out.println();
}
}
然后是你的重复方法:
static void repeat(char arr2[],int arr1[],int p)// creates and prints the word
{
while(arr1[0] < p-1){
printWord(char arr2[],int arr1[],int p);
arr1[p-1]+=1; // your looping logic
for(int ini=p-1;ini>0;ini--)
{
if(arr1[ini]>p-1)
{
arr1[ini-1]+=1;
arr1[ini]=0;
}
}
}
}
使其成为非递归的将帮助您避免堆栈溢出错误。
其他建议:
验证输入单词在 运行 任何逻辑之前是否没有两个相同的字母,如果我输入单词 "see" 您的代码将找不到任何组合,因为没有组合可以使三个字母的单词可以用字母 {'s','e','e'} 创建,无需重复。
您的 redcheck
方法使用了太多变量:
static boolean redcheck(int array[])// checks if letters are repeated
{
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]==array[j])
{
return false;
}
}
}
return true;
}
我已经编写了一个代码来生成一个单词的所有可能的字母组合,而不重复任何字母或任何特定单词。代码如下
static boolean redcheck(int array[])// checks if letters are repeated
{
boolean check=true;
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]==array[j])
{
check=false;
break;
}
}
}
return check;
}
static void repeat(char arr2[],int arr1[],int p)// creates and prints the word
{
if(redcheck(arr1))
{
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
for(int i=0;i<p;i++)
System.out.print(arr1[i]);
System.out.println();
}
arr1[p-1]+=1;
for(int ini=p-1;ini>0;ini--)
{
if(arr1[ini]>p-1)
{
arr1[ini-1]+=1;
arr1[ini]=0;
}
}
if(arr1[0]>p-1)
return;
repeat(arr2,arr1,p);
}
public static void main()
{
Scanner sc=new Scanner(System.in);
System.out.println("enter word");
String a=sc.nextLine();
int num=a.length();
char arr[]=new char[num];
for(int c=0;c<a.length();c++)
arr[c]=a.charAt(c);
int arr1[]=new int[num];
for(int i:arr1)
arr1[i]=0;
repeat(arr,arr1,num);
}
代码在任何长度为 4 的单词之前都可以正常工作,但是当它超过 4 时,它会抛出堆栈溢出错误。经过一些检查,造成问题的主要代码部分是打印部分本身,即
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
我真的找不到我哪里出错了。上面提到的下面的 print 语句按单词的打印顺序打印单词的索引,并且不会给出任何错误。 我正在使用 bluej 编辑器,看起来我有 512MB 的堆栈内存。 请提前help.thanks
编辑:错误代码是 java.lang.WhosebugError: 空
有 4 个字母(假设 none 个相同),这些字母有 4^4 = 256 种可能的组合。由于您的代码当前已设置,您将至少递归 256 次,然后返回一个值,这将在您的堆栈上占用大量内存。如果您尝试扩大到 5 个字母(再次假设 none 相同),您将有 5^5 = 3125 种可能的组合,等等...... 您收到的堆栈溢出错误是由于您递归的时间长短所致。
我的建议: 将你的 repeat 方法分成两部分:
static void printWord(char arr2[],int arr1[],int p) {
if(redcheck(arr1))
{
for(int i=0;i<p;i++)
System.out.print(arr2[arr1[i]]);
for(int i=0;i<p;i++)
System.out.print(arr1[i]);
System.out.println();
}
}
然后是你的重复方法:
static void repeat(char arr2[],int arr1[],int p)// creates and prints the word
{
while(arr1[0] < p-1){
printWord(char arr2[],int arr1[],int p);
arr1[p-1]+=1; // your looping logic
for(int ini=p-1;ini>0;ini--)
{
if(arr1[ini]>p-1)
{
arr1[ini-1]+=1;
arr1[ini]=0;
}
}
}
}
使其成为非递归的将帮助您避免堆栈溢出错误。
其他建议:
验证输入单词在 运行 任何逻辑之前是否没有两个相同的字母,如果我输入单词 "see" 您的代码将找不到任何组合,因为没有组合可以使三个字母的单词可以用字母 {'s','e','e'} 创建,无需重复。
您的 redcheck
方法使用了太多变量:
static boolean redcheck(int array[])// checks if letters are repeated
{
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]==array[j])
{
return false;
}
}
}
return true;
}