С 4 буквами (при условии, что ни одно из них не совпадает) существует 4 ^ 4 = 256 возможных комбинаций этих букв.Поскольку ваш код в настоящее время настроен, вы будете выполнять рекурсию как минимум 256 раз, прежде чем возвращать значение, которое будет иметь большую стоимость памяти в вашем стеке.Если вы попытаетесь увеличить до 5 букв (опять же, если предположить, что ни одна из них не совпадает), у вас будет 5 ^ 5 = 3125 возможных комбинаций и т. Д. ... Ошибка переполнения стека возникает из-за количества времени, которое вы повторяете.
Моя рекомендация: разделите ваш метод повторения на две части:
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;
}
}
}
}
, сделав его нерекурсивным, поможет вам избежать стекаошибка переполнения.
Дополнительные рекомендации: прежде чем выполнять какую-либо логику, убедитесь, что во входном слове нет двух одинаковых букв, ваш код не найдет никаких комбинаций, если я введу слово «видеть», поскольку комбинаций нет.таким образом, что трехбуквенное слово может быть создано с буквами {'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;
}