【问题标题】:Java recursion reverse stringJava递归反向字符串
【发布时间】:2014-07-10 05:37:21
【问题描述】:

您好,我正在尝试理解下面的递归方法,但它似乎太混乱了。我知道 reversePrint 方法调用它自己,但我的问题是,它第一次运行它应该打印 bcdef + a = bcdef。这是我感到困惑的地方,下一次运行时 b 变成了 charAt(0) ......那么 a 在哪里?它们会暂时存储在某个地方吗?有人可以帮我理解它。非常感谢

public static void main(String[] args) {
    // TODO code application logic here
    System.out.println(reversePrint("abcdef"));
}

public static String reversePrint(String s) {
    if (s.length() <= 1) {
        return s;
    }
    return reversePrint(s.substring(1)) + s.charAt(0);
}

【问题讨论】:

标签: java recursion


【解决方案1】:

让我们稍微看一下这个例子:

您首先调用reversePrint("abcdef")。简而言之,我将其写为rev(abcdef)

rev(abcdef)

= rev(bcdef) a     // Take the beginning (a) and put it on the end.
= (rev(cdef) b) a 
= ((rev(def) c) b) a
= (((rev(ef) d) c) b) a
= ((((rev(f) e) d) c) b) a

= fedcba

在每一步,我们都会在原始子串上评估rev。所以首先我们评估rev(abcdef)。但要解决这个问题,我们需要评估 rev(bcdef),为此我们需要 rev(cdef) 等等。

我们一直计算到rev(f),也就是f。然后我们将一个字符串连接到下一个字符串,最后得到rev(abcdef) = fedcba

我建议观看Khan Academy's video on recursion(使用斐波那契数列)。他在这方面做得很好。

【讨论】:

【解决方案2】:

这里首先在第一个字符和剩余字符串之间分离一个字符串,这个过程一直重复,直到字符串的长度小于或等于1。

abcdef 
  bcdef   a
   cdef   b
     def  c
       ef d
        f e
          f

再次终止编译器向上堆栈然后生成最终结果。

美联储... 希望清楚。

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2020-02-17
    • 2013-05-11
    • 2020-12-21
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多