簡體   English   中英

java 中遞歸 function 中的字符串返回值

[英]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你最后只保留*第一個字符**,對下一行做同樣的事情

  • 把第一個字符放在最后
  • 將 rest 發送到方法
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM