【问题标题】:Recursively print the reverse of a String in Java在Java中递归打印字符串的反转
【发布时间】:2014-01-12 15:32:04
【问题描述】:

由于某种原因,当字符串长度为零时,它不会退出 while 循环。有人可以帮我解决这个问题吗?

static String str1 = "";

public static void reverse(String str) {
    while (str.length() > 0) {
        str1 = str1 + str.charAt(str.length() - 1);
        StringBuffer str_buf = new StringBuffer(str);
        str = str_buf.deleteCharAt(str.length() - 1).toString();
        reverse(str);
    }
    System.out.println("String is " + str1);
}

【问题讨论】:

    标签: java string recursion while-loop


    【解决方案1】:

    while 替换为if

    if(str.length()>0)
    

    更新:

    while 失败的原因是,str.length() 变为 0 后,它到达递归的底部,控制返回到“更高”级别,str.length() 仍然是 1。所以它再次调用自己。

    所以用while,到达0后,会在1到0之间不断循环。

    【讨论】:

    • 但是为什么while循环不起作用?毕竟它也在检查条件。
    • 此外,字符串是按值传递的,而不是按引用传递的。所以当你做 str = str_buf.deleteCharAt(str.length() - 1).toString();在内部递归中,它不会改变调用当前方法的方法中 str 的值,即之前的递归
    • @EnriqueFueyo 是的,但这没关系。这个工作的诀窍是str1 在方法之外,所以它超越了你正在查看的方法调用。
    • @DavidWallace 这很重要,因为 while 循环正在检查 str.length 是否大于 0,但 str 永远不会改变
    • str 确实发生了变化。每次你写str = str_buf.deleteCharAt(str.length() - 1).toString(); 它都会改变。唯一的问题是str 有多个副本。但是它们都变短了,最终长度为零。即使存在while,该程序也会终止。它打印的内容比您预期的要多得多。
    【解决方案2】:

    您对其进行编码的方式是遍历整个字符串并递归调用该函数。因此,对于短字符串“abcd”,第一次通过将调用反向与“abc”、“ab”和“a”。对“abc”的反向调用将使用“ab”和“a”调用反向。如果您递归调用该函数,那么您不需要 @sanjeev-mk 建议的 while 循环,而是只需要 if 作为退出条件。

    【讨论】:

      【解决方案3】:

      我相信有更适合递归打印字符串反向的代码:

      public void reverseStringPrint(String inputString, int index){
          if (index < (inputString.lenght() - 1))
              reverseStringPrint(inputString, index + 1);
          System.out.print(inputString.charAt(index);
      }
      

      以 index = 0 运行。

      为了在输出中获得反转的字符串(不仅仅是打印它),您可以这样做:

      public String reverseString(String inputString, int index){
             String restOfTheString = "";
             if (index < (inputString.lenght() - 1))
                 restOfTheString = reverseStringPrint(inputString, index + 1);
             return charAt(index) + restOfTheString;
         }
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 2020-07-25
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 2020-02-22
        • 2017-02-26
        • 2014-06-07
        • 1970-01-01
        相关资源
        最近更新 更多