[英]How does this code work? (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)
什么作用? 這種方法如何達到基本情況?
因為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);
它會按預期工作。
為了更好地理解遞歸代碼,您可以嘗試打印每個方法調用的狀態,例如
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"
我們可以看到幾件事:
b
和c
。 然后你返回reverse(b) + c
。首先,'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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.