【问题标题】:Problem with recursive method in reversing the string递归方法在反转字符串中的问题
【发布时间】:2019-05-12 17:05:17
【问题描述】:

当我使用递归方法反转字符串时,它给了我 stackOverflow 错误。

public class ReverseString {

    public static void main(String[] args) {
        String str = "Juhi";
        System.out.println(recursiveString(str));
    }

    static String recursiveString(String str) {     
        return !str.equals("") ? recursiveString(str.substring(1) + str.charAt(0)) : str;

    }
}

【问题讨论】:

  • 除了str.substring(1) + str.charAt(0),你永远不会传递任何东西,所以基本情况永远不会正确(除非你传入一个空的String开始)并且递归永远不会停止
  • 这样简单的错误很容易通过使用调试器、逐步执行代码并检查变量值来解决。尽快学会使用你的调试器。这真的不难。或者至少在代码中添加 println() 语句。
  • 这样做有一个警告。它不适用于所有可能的 Unicode 字符。见dzone.com/articles/the-right-way-to-reverse-a-string-in-java

标签: java string recursion reverse


【解决方案1】:

这应该可以解决问题:

static String recursiveString(String str) {
    return !str.equals("") ? recursiveString(str.substring(1)) + str.charAt(0) : str;
}

在您的代码中,您并没有减少字符串参数的长度,它始终是相同的输入,所以基本上它进入了一个无限循环。如果我们在递归调用之后移动连接部分,那么每次递归调用的字符串都会变短,直到它为空,表示递归结束。

【讨论】:

  • 感谢您的更正。我在递归调用时输入错误。
  • @JuhiUdhale 太棒了!如果这个答案有用,请考虑接受它,只需单击左侧的复选标记:)
  • 可能值得补充的是,这不是 Unicode 感知的,尽管这可能不是必需的,因为它只是一个学习练习。
【解决方案2】:
public static void main(String[] args) {
        String str = "Juhi";
        System.out.println(recursiveString(str));
    }

    static String recursiveString(String str) {
        return !str.equals("") ? recursiveString(str.substring(1) ) + str.charAt(0): str;

    }
}

【讨论】:

    【解决方案3】:

    可识别 Unicode 的递归反向

    虽然其他答案向您展示了您出错的地方以及如何编写适用于基本 Unicode 字符的递归字符串反转算法,但它们对supplementary Unicode characters 产生了错误的结果。以下方法适用于所有 Unicode 字符:

    static String recursiveReverse(String str) {
        if (str.isEmpty())
            return "";
        int offsetToSecondCodePoint = str.offsetByCodePoints(0,1);
        return recursiveReverse(str.substring(offsetToSecondCodePoint))
                + str.substring(0, offsetToSecondCodePoint);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2013-09-27
      • 2010-10-25
      • 2012-09-24
      • 2020-06-07
      相关资源
      最近更新 更多