[英]String return value in recursive function in java
所以我目前正在練習 java,我是一個初學者,我嘗試解釋我編寫的所有示例,以便我能夠理解事情是如何以及為什么會這樣。 我理解遞歸的概念,但是當我試圖解釋這段代碼時遇到了這個問題:
import java.util.Scanner;
public class JavaExample {
public static void main(String[] args) {
String str;
System.out.println("Enter your username: ");
Scanner scanner = new Scanner(System.in);
str = scanner.nextLine();
scanner.close();
String reversed = reverseString(str);
System.out.println("The reversed string is: " + reversed);
}
public static String reverseString(String str)
{
if (str.isEmpty())
return str;
//Calling Function Recursively
return reverseString(str.substring(1)) + str.charAt(0);
}
}
到目前為止,我對遞歸的了解,我試圖這樣解釋它。 例如,讓我們有一個字符串“Petar”:
reverseString(etar)+P
reverseString((tar)+etar)+P
reverseString((ar)+tar+etar)+P
reverseString((r)+ar+tar+etar)+P
-----------------------------------
r+ar+tar+etar+P
我注意到正確的答案是每個作品的第一個字符,所以我必須接近。
感謝您抽出寶貴時間,如果我沒有清楚地表達自己,我很抱歉,我來自歐洲(英語不好)。
你對第一行做的很好reverseString(etar)+P
你最后只保留*第一個字符**,對下一行做同樣的事情
reverseString(etar)+P
reverseString(tar) +e+P
reverseString(ar) +t+e+P
reverseString(r) +a+t+e+P
reverseString('') +r+a+t+e+P // stops when empty string is passed
從最簡單的例子開始應該很清楚:空字符串和大小為 1 的字符串。然后替換每個調用的 arguments,使其更明顯:
// string.isEmpty() is true, so the empty string is returned immediately
reverse("") -> ""
reverse("a") -> reverse("") + 'a' -> ("") + 'a' -> "a"
這些是簡單的例子,讓我們用更長的字符串試試:
reverse("ab") -> reverse("b") + 'a'
reverse("abc") -> reverse("bc") + 'a'
-> (reverse("c") + 'b') + 'a'
-> ((reverse("") + 'c') + 'b') + 'a'
-> ((("") + 'c') + 'b') + 'a'
-> "cba"
一般模式現在應該很清楚了。 為了完整起見,讓我們手動“展開”對 4 個字符串的遞歸調用:
reverse("abcd") -> reverse("bcd") + 'a'
-> (reverse("cd") + 'b') + 'a'
-> ((reverse("d") + 'c') + 'b') + 'a'
-> (((reverse("") + 'd') + 'c') + 'b') + 'a'
-> (((("") + 'd') + 'c') + 'b') + 'a'
-> "dcba"
你的第一個電話是對的,但其他電話有點不對勁。 在每個遞歸調用中,您都返回以第一個字符結尾而不是開頭的字符串。 因此,遞歸看起來像這樣:
reverseString("Petar")
return reverseString("etar") + "P"
return reverseString("tar") + "e"
return reverseString("ar") + "t"
return reverseString("r") + "a"
return reverseString("") + "r"
return ""
所以function會返回:(((((("")+"r")+"a")+"t")+"e")+"P"),也就是"rateP"。
在您的示例中,當您的 function 僅到達像 Peter 這樣的一個字符時,它僅變為“P”並且您調用的字符串不為空
substring(1)
這會調用超出范圍的索引,而字符串在索引 0 上只有 P 而在索引 1 上沒有你必須放置一個基本情況來檢查字符串長度是否等於或小於 1
它是這樣工作的:
reverseString("Peter") =
reverseString("eter") + P =
(reverseString("ter") + e) + P =
((reverseString("er") + t) + e) + P =
(((reverseString("r") + e) + t) + e) + P =
((((reverseString("") + r) + e) + t) + e) + P =
(((("" + r) + e) + t) + e) + P =
((((r) + e) + t) + e) + P =
(((r + e) + t) + e) + P =
(((re) + t) + e) + P =
((re + t) + e) + P =
((ret) + e) + P =
(ret + e) + P =
(rete) + P =
rete + P =
reteP
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.