我想寫一個程序在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
不知道堆棧溢出,但每次遞歸調用'decompress'時,遞歸例程都會創建一個** new **'newString'。例程的新調用將**不附加到舊調用使用的相同'newString'。你的遞歸方法可能需要把'newString'作爲它自身傳遞的參數,然後在第一次調用遞歸例程之前,外部的非遞歸例程將需要初始化它。 – ajb
你有沒有嘗試在調試器中逐句通過你的代碼?這和幾個很好的'System.out.println'記錄調用將幫助你找出爲什麼你的遞歸沒有達到基本情況並導致錯誤... – Krease