Java 递归解压缩程序未完成



我正在尝试制作一个程序来解压缩使用RLE压缩的字符串。然而,解压缩程序必须递归编写,不需要循环,也不需要在方法外部声明变量。以下是我迄今为止最接近的尝试,我能够解压缩压缩字符串的第一个"片段"(例如:4w、q、g、J、6y等)。在那之后,它就不会打印出任何其他内容,我很难理解为什么。非常感谢

public class StringRec{
public static void main(String[] a){
System.out.println("string: ");
String decomp = IO.readString();
System.out.println(decompress(decomp));
}
public static String decompress(String compressedText){
    int count = compressedText.length();
    String index = "";
 if(count == 0){
        return "";  
}

我想做一些条件,不再调用解压方法,因为它们的条件是它们是字符串中的最后一个片段,所以在它们的部分被解压缩后,它就完成了。自然地,在调用了解压调用的其他条件之后,会在运行时结束时进行调用。不知道为什么它不起作用。

else{
 if(Character.isDigit(compressedText.charAt(0))){
        String s = String.format("%0" + compressedText.charAt(0) + "d", 0).replace('0', compressedText.charAt(1));
        index = s;
        compressedText = compressedText.substring(2);
        decompress(compressedText);
    }
    else if(Character.isDigit(compressedText.charAt(0)) && compressedText.length()==2){ 
        String s2 = String.format("%0" + compressedText.charAt(0) + "d", 0).replace('0', compressedText.charAt(1));
        index = s2;
    }else if(Character.isLetter(compressedText.charAt(0))){     
        String s3 = Character.toString(compressedText.charAt(0));
        index = s3;
        compressedText = compressedText.substring(1);
        decompress(compressedText);
    }
    else if(Character.isLetter(compressedText.charAt(0)) && compressedText.length()==1){
        String s4 = Character.toString(compressedText.charAt(0));
        index = s4;
    }
return index;
}
}

我目前的猜测是,这与解压方法的调用方式有关,或者与我如何安排在解压方法调用后返回的输出有关,但我无法解释字符串的第一部分是如何一致工作的。

试试这个。

public static String decompress(String compressedText) {
    int count = compressedText.length();
    if (count == 0) {
        return "";
    } else if (Character.isDigit(compressedText.charAt(0))) {
        String s = String.format("%0" + compressedText.charAt(0) + "d", 0)
                .replace('0', compressedText.charAt(1));
        return s + decompress(compressedText.substring(2));
    } else if (Character.isLetter(compressedText.charAt(0))) {
        String s3 = Character.toString(compressedText.charAt(0));
        return s3 + decompress(compressedText.substring(1));
    } else
        return compressedText;
}

它不起作用,因为您忘记将递归解压缩调用的结果与当前索引变量值"连接"在一起。因此,您可以"丢弃"递归调用的结果,并且只得到第一次调用的结果。

如果在代码中用index = index + decompress(compressedText)修改decompress(compressedText)行,则结果将是您所期望的。

(顺便说一句,您应该将主题重命名为类似"Java递归解压缩程序没有得到预期的结果"的内容,因为从标题来看,我希望有一些代码可以产生无限递归调用:)

最新更新