Я пытаюсь написать программу на Java, которая распаковывает сжатый оператор RLE с использованием рекурсии, но я постоянно получаю ошибки переполнения стека, и я не знаю почему.Рекурсивный метод декомпрессии Java RLE [ошибка stackoverflow]
Вот что я написал до сих пор:
public class StringRec
{
public static void main (String args[]){
System.out.println(decompress("wed4d"));
}
//Version 0.1
public static String decompress(String compressedText)
{ String cText = compressedText;
StringBuffer newString = new StringBuffer();
int i = 0;
if (cText==""){return newString.toString();}
if(!cText.isEmpty()){
if(Character.isLetter(cText.charAt(i))){
newString.append(cText.charAt(i));
cText = cText.substring(1,cText.length());
return decompress(cText);
//remove first letter, return new modified string with removed first letter to decompress.
}
if(Character.isDigit(cText.charAt(i))){
int c = cText.charAt(i)-'0';
if (c==0){
cText = cText.substring(2,cText.length());}
return decompress(cText);
//delete c and the letter after it and send new modified string to decompress.
}
}else {
newString.append(cText.charAt(i+1));
int c = cText.charAt(i);
c--;
String num = ""+c;
cText = cText.replaceFirst(num, Character.toString(cText.charAt(i)));
return decompress(cText);
//appends character after number to newString, decrements the number and returns
//the new modified string to decompress with the first number decremented by one
}
return newString.toString();
}
}
Мой базовый вариант для рекурсии является пустой строкой, если строка начинается с буквы, что письмо добавляется к StringBuffer NewString только один раз, и что первый буква исходной строки удаляется из последовательности строк, а новая строка передается для распаковки; если он начинается с числа, которое равно нулю, первые два символа строки удаляются, а новая строка передается для распаковки.
Если это число больше 0 [else], то буква перед ним добавляется в stringbuffer newString и число уменьшается и заменяет номер в начале строки и передает новую строку [с помощью первоначальный первый номер символа - 1] для распаковки.
Как долго длится строка? Java не поддерживает неограниченную рекурсию; рекурсивные алгоритмы работают только в том случае, если они не слишком усложняются. – user2357112
Не знаю о переполнении стека, но каждый раз, когда вы вызываете 'распаковывать' рекурсивно, рекурсивная подпрограмма создаст ** новую **' новую строку '. Новый вызов подпрограммы ** не будет ** добавляться к той же «новой строке», что использовался старым вызовом. Вероятно, вашему рекурсивному методу нужно взять 'newString' в качестве параметра, который он продолжает передавать самому себе, а затем внешняя нерекурсивная подпрограмма должна будет инициализировать его перед вызовом рекурсивной подпрограммы в первый раз. – ajb
Вы пробовали переходить через свой код в отладчик?Это и несколько хорошо размещенных вызовов журнала «System.out.println» помогут вам узнать, почему ваша рекурсия не достигает базового случая и вызывает ошибку ... – Krease