这段代码是如何工作的? (Java递归)

时间:2017-10-30 03:01:14

标签: java recursion

为什么这段代码有效?

public static String reverse(String a) {
        if(a.length() == 0) {
            return a;
        } else {
            return reverse(a.substring(1)) + a.charAt(0);
        }
    }

这不是吗?

public static String reverse(String a) {
            if(a.length() == 0) {
                return a;
            } else {
                return reverse(a.substring(1)) + a.substring(0);
            }
        }

此外,递归如何在案例1中起作用,添加a.charAt(0)的作用是什么?这种方法如何达到基本情况?

3 个答案:

答案 0 :(得分:5)

因为a.charAt(0)会返回第一个字符,而a.substring(0)会返回整个String(来自索引0)。变化

 return reverse(a.substring(1)) + a.substring(0);

类似

 return reverse(a.substring(1)) + a.substring(0, 1);

它将按预期工作。

答案 1 :(得分:1)

为了更好地理解递归代码,您可以尝试为每个方法调用打印状态,例如

public static String reverse(String a) {
    System.out.println("Calling reverse(\"" + a + "\")");
    if(a.length() == 0) {
        System.out.println("Base case encountered for string : \"" + a + "\"");
        return a;
    } else {
        String b = reverse(a.substring(1));
        String c = a.charAt(0);
        System.out.println(reverse(\"" + a + "\") returning \"" + b + "\" + \"" + c + "\"");
        return b + c;
    }
}

当您尝试拨打reverse("xyz")时,您会在标准输出中看到以下文字:

Calling reverse("xyz")
Calling reverse("yz")
Calling reverse("z")
Calling reverse("")
Base case encountered for string : ""
reverse("z") returning "" + "z" = "z"
reverse("yz") returning "z" + "y" = "zy"
reverse("xyz") returning "zy" + "x" = "zyx"

我们可以看到几件事:

  • 递归减少字符串,直到达到字符串为空(长度为零)的基本情况。
  • 对于每个非基本案例,您将字符串拆分为两个段,即bc。然后返回reverse(b) + c

答案 2 :(得分:0)

首先,' a.substring()'返回从作为参数给出的索引开始的子字符串,因此在使用' a.substring(1)'作为递归方法的参数,第一个字符总是被跳过,并且作为参数给出的字符串的长度逐渐减小。一旦没有角色,它就会到达基本情况。

其次,' a.charAt()'返回作为参数给出的字符串的索引处存在的字符。所以' a.charAt(0)'返回字符串的第一个索引' a'它作为递归方法的参数给出。

最后,第一个代码可以工作,因为每次它发送除第一个字符之外的整个字符串,并且它包含返回的字符串末尾的第一个字符。所以最后,整个字符串都被反转了。 另一方面,第二个代码包括从字符串的第一个索引开始的整个子字符串,而不是第一个字符。

要使代码有效,您可以使用' charAt(0)'像第一个代码 -

return reverse(a.substring(1)) + a.charAt(0);

或者您可以使用' a.substring(0,1)'它只考虑第一个字符作为子字符串并返回它 -

return reverse(a.substring(1)) + a.substring(0, 1);