【问题标题】:Java Recursive Decompression Program Doesn't FinishJava 递归解压程序未完成
【发布时间】:2016-03-18 03:56:44
【问题描述】:

我正在尝试制作一个程序来解压缩使用 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;
}
}

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

【问题讨论】:

    标签: java recursion standard-library compression


    【解决方案1】:

    它不起作用,因为您忘记将递归解压缩调用的结果与当前索引变量值“连接”。因此,您“丢弃”递归调用的结果,而只有第一次调用的结果。

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

    (顺便说一句,您应该将主题重命名为“Java Recursive Decompression Program does not get the expected result”,因为从标题中我预计会有一些代码会产生无限递归调用 :))

    【讨论】:

      【解决方案2】:

      试试这个。

      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;
      }
      

      【讨论】:

      • 非常感谢!这行得通,我想我明白为什么,但是:在返回语句中,它返回字符串是否重要,再加上再次激活解压缩,或者如果先解压缩,然后加上字符串,那部分是否可以工作
      • 如果你写return decompress(...) + s;return decompress(...) + s3,你会得到相反的结果。
      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 2010-12-26
      • 2010-11-02
      • 2012-02-17
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多