簡體   English   中英

charAt如何反轉此方法中的輸入?

[英]How does charAt reverse the input in this method?

//method
public static String foo(String s)

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

return s;

else

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

foo(“abcd”)評價的是什么? 我的理解是這會扭轉輸入,但為什么呢?

你在這里面臨遞歸

遞歸的每個級別都將第一個字符附加到結尾,並在字符串的后綴上調用遞歸調用。

在您的示例中,調用堆棧看起來像這樣:

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")

希望這清楚地表明遞歸在這種情況下是如何工作的:

foo("bcd") + "a"
  (foo("cd") + "b") + "a"
    ((foo("d") + "c") + "b") + "a"
      (("d" + "c") + "b") + "a" -> "dcba"

這是一個遞歸逆轉。 s.substring(1)是沒有第一個字符的行; s.charAt(0)是第一個字符。

函數所說的是“如果行是一個字符長,則答案是行本身;否則,刪除第一個字符,計算相同的函數,並將截斷的字符添加到結果的末尾”。

你可以在一張紙上解決如何執行上述步驟相當於反轉字符串。

編輯:值得注意的是,如果您嘗試將其傳遞為空字符串,則此實現將以異常崩潰。 if (s.length() == 1)更改為if (s.length() == 0)將解決此問題(感謝Tom Hawtin - 在評論中提及此問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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