【问题标题】:Can someone explain this recursive Java method that reverses a string?有人可以解释这种反转字符串的递归 Java 方法吗?
【发布时间】:2020-12-23 04:03:07
【问题描述】:

所以我是一名大三学生,试图理解递归。我了解一般概念,但不了解它是如何正确实施的。我发现了这个非常简单的代码,但似乎无法理解最后一行(递归)是如何工作的。任何帮助和解释都会很棒,谢谢! (也快到决赛了,我很紧张)

public static String reverse(String s) {
    if (s.isEmpty())
        return s;
    return reverse(s.substring(1)) + s.charAt(0);
}

【问题讨论】:

  • 拿一张纸,使用输入字符串abc,然后写出所有递归调用发生的情况。这确实是您可以在这里学习的最佳练习。
  • 正如@TimBiegeleisen 建议的那样,我认为遵循一次跑步的流程会对您有所帮助。取一个字符串(abcdefg 或任何非对称的),并在返回之前使用额外的 System.out.println(s); 运行该代码:然后您应该了解它是如何被操纵的

标签: java string recursion substring charat


【解决方案1】:

递归过程使用 substring 逐个删除字符,因为 substring 采用开始索引,在您的情况下为 1 所以如果我们的字符串是“ABC”,那么“ABC”.substring(1) 那么 substring 将返回“BC” 所以在你的情况下,反向是用子字符串处理 让我们的输入是反向方法的“abcd”

然后过程将喜欢使用反向方法作为递归

bcd -> 1st reverse will call with this value
cd -> then reverse will call with cd
d -> then reverse will call with d
"" -> then reverse will call with "" as its blank string so reverse will terminate

一旦反向方法到达 isEmpty 语句,s.charAt(0) 将启动,它将在反向方法的返回输出的末尾添加,因此它修改输出,如

d
dc
dcb
dcba

所以整个过程都会喜欢:

input to reverse method :bcd
input to reverse method :cd
input to reverse method :d
input to reverse method : "" empty string
result received from reverse method  
After modified result with return value from reverse method and charAt(0) operation : d
result received from reverse method  d
After modified result with return value from reverse method and charAt(0) operation : dc
result received from reverse method  dc
After modified result with return value from reverse method and charAt(0) operation : dcb
result received from reverse method  dcb
After modified result with return value from reverse method and charAt(0) operation : dcba

【讨论】:

    【解决方案2】:

    为了清楚起见,这里是同一算法的迭代版本,它以遇到顺序遍历字符串的字符,并以相反的顺序将它们连接成一个新字符串,交换和:

    public static String reverse(String str) {
        String revStr = "";
        for (char ch : str.toCharArray()) {
            revStr = ch + revStr;
        }
        return revStr;
    }
    
    public static void main(String[] args) {
        System.out.println(reverse("some text string"));
    }
    

    输出:

    gnirts txet emos
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多