Java递归解压缩程序不';完不成
我正在尝试制作一个程序来解压缩使用RLE压缩的字符串。然而,解压程序必须递归编写,没有循环,也没有在方法之外声明变量。下面是我迄今为止最接近的尝试,我能够解压缩压缩字符串的第一个“片段”(例如:4w、q、g、J、6y等)。在那之后,它不会打印出任何其他内容,我很难理解为什么。非常感谢Java递归解压缩程序不';完不成,java,recursion,standard-library,compression,Java,Recursion,Standard Library,Compression,我正在尝试制作一个程序来解压缩使用RLE压缩的字符串。然而,解压程序必须递归编写,没有循环,也没有在方法之外声明变量。下面是我迄今为止最接近的尝试,我能够解压缩压缩字符串的第一个“片段”(例如:4w、q、g、J、6y等)。在那之后,它不会打印出任何其他内容,我很难理解为什么。非常感谢 public class StringRec{ public static void main(String[] a){ System.out.println("string: "); String decomp
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+decompressed(compressedText)
修改decompressed(compressedText)
行,您的结果将是预期的结果
(顺便说一句,您应该将主题重命名为“Java递归解压程序未获得预期结果”,因为从标题中,我希望看到一些产生无限递归调用的代码:)非常感谢!这是可行的,我想我理解为什么,但是:在return语句中,它返回字符串并再次激活解压缩是否重要,或者如果先解压缩,然后再编写
return decompress(…)+s,这部分是否可以工作
和返回解压缩(…)+s3
,您将得到相反的结果。