2
//method
public static String foo(String s)

{
if (s.length() == 1)

return s;

else

return foo(s.substring(1)) + s.charAt(0);
}

foo(“abcd”) 的评估结果是什么?我的理解是这会反转输入,但这是为什么呢?

4

3 回答 3

3

您在这里面临递归

递归的每一级都将第一个字符附加到末尾,并在字符串的后缀上调用递归调用。

在您的示例中,调用堆栈将如下所示:

s = "abcd" => append 'a' to the end, and invoke on "bcd".
s = "bcd" => append 'b' to the end, and invoke on "cd".
s = "cd" => append 'c' to the end, and invoke on "d".
s= = "d" => return "d" as it is.

当您从递归返回时,实际上是以相反的顺序附加它:

return "d"
return "d" + 'c' (="dc")
return "dc" + 'b' (="dcb")
return "dcb" + 'a' (="dcba")
于 2012-05-01T13:49:14.333 回答
3

希望这可以清楚地说明递归在这种情况下是如何工作的:

foo("bcd") + "a"
  (foo("cd") + "b") + "a"
    ((foo("d") + "c") + "b") + "a"
      (("d" + "c") + "b") + "a" -> "dcba"
于 2012-05-01T13:51:18.290 回答
3

这是一个递归的逆向。s.substring(1)是没有第一个字符的行;s.charAt(0)是第一个字符。

该函数的意思是“如果该行是一个字符长,则答案是该行本身;否则,砍掉第一个字符,计算相同的函数,并将砍掉的字符添加到结果的末尾”。

您可以在一张纸上计算出执行上述步骤如何相当于反转字符串。

编辑:值得注意的是,如果您尝试向其传递一个空字符串,此实现将因异常而崩溃。更改if (s.length() == 1)if (s.length() == 0)将解决此问题(感谢 Tom Hawtin - tackline 在评论中提到这一点)。

于 2012-05-01T13:51:33.630 回答