Java 递归解压程序没有完成

Java Recursive Decompression Program Doesn't Finish

我正在尝试制作一个程序来解压缩使用 RLE 压缩的字符串。然而,解压程序必须递归地编写,不能有循环,也不能在方法外声明变量。以下是我迄今为止最接近的尝试,我能够解压缩压缩字符串的第一个 "piece"(例如: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;
}

它不起作用,因为您忘记 'concatenate' 使用当前索引变量值的递归解压缩调用的结果。因此,您 'drop' 递归调用的结果只有第一次调用的结果。

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

(顺便说一句,您应该将主题重命名为“Java 递归解压程序未获得预期结果”之类的名称,因为从标题中我希望得到一些产生无限递归调用的代码:))