java - 有人可以解释一下使用尾递归的反向字符串算法吗?

标签 java tail-recursion

我很抱歉问这个问题是愚蠢的。在获取给定字符串的最后一个字符并返回之前,我能够理解代码,然后我无法关联递归逻辑。

在此处发布之前,调试器部分地帮助了我。不幸的是,不是 100%

你能帮我理解一下吗?

public static void main(String[] args) {
    System.out.println(reverseRecursively("abcd"));
}

public static String reverseRecursively(String str) {
    if (str.length() < 2) {
        return str;
    }
    return reverseRecursively(str.substring(1)) + str.charAt(0);
}

调试器输出:

0=abcd
1=bcd
2=cd
3=d
Final: dcba

最佳答案

嗯,这是一个非常简单的逻辑:

return reverseRecursively(str.substring(1)) + str.charAt(0);

如果您在返回之前放置一个 System.out.println(),您将获得以下输出:

Recursing with substring: bcd and adding a
Recursing with substring: cd and adding b
Recursing with substring: d and adding c
Adding d as final char

如果你反转它,你会得到 dcba

为什么会反转呢?

好吧,你必须想到调用跟踪:

return reverseRecursively("bcd") + a -> retruns "dcba"
-> return reverseRecursively("cd") + b -> returns "dcb"
 -> return reverseRecursively("d") + c -> returns "dc"
   -> return d -> returns "d"

我想关键是要理解递归总是与另一个递归的结果相结合。

关于java - 有人可以解释一下使用尾递归的反向字符串算法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229468/

相关文章:

functional-programming - 在 scheme 中转换具有两次递归调用的函数以使其成为尾递归

javascript - 关于 "Tail Call Optimization"文章的问题

loops - 遍历 Haskell 中的两个变量

java - JSP中获取Set的第一个元素

Java Bouncy CaSTLe TLS 协议(protocol)版本顺序?

java - 当提供自定义比较器或元素实现 Comparable 时,如何拆分方法中的逻辑?

scala - 有没有办法关闭Scala编译器的尾递归优化?

java - 将取消按钮添加到我的 JOptionPane

基于java的开发环境

haskell - 为什么这个尾递归 Haskell 函数较慢?