【发布时间】:2019-10-05 15:23:08
【问题描述】:
我已经编写了一个代码来生成一个单词的所有可能的字母组合,而不会重复任何字母或任何特定的单词。代码如下
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 的堆栈内存。 请帮助。在此先感谢。
编辑:错误代码是 java.lang.StackOverflow错误: 空
【问题讨论】:
-
我不清楚代码是如何工作的,但除非
arr1[0] > p - 1,否则你总是在递归。你的意思是递归那么多吗?请注意,您只需使用 do/while 循环即可轻松避免递归。 -
包含确切的错误信息会有所帮助
-
@JonSkeet 字母的重新排列方式可以与人们使用的点击计数器进行比较。假设你有一个只有数字 0、1、2 的数字系统。现在最小的是000,然后你加1得到001,然后是002。当002到来时,下一个数字通常应该是003,但不包括3,因此重置个位,下一个位置加1 .给010。就像最后一个应该是222,因此当它增加1时,逻辑导致300被制作,但由于3不包括在内并且在最后一个位置,所以函数被终止
-
@P.Soutzikevich 它的 java.lang.StackOverflowError: null
-
@Crasshassin 不在 cmets 中。适当编辑您的问题
标签: java arrays recursion stack-overflow