using System;
class RevStr {
public void displayRev(string str) {
if(str.Length > 0)
displayRev(str.Substring(1, str.Length-1));
else
return;
Console.Write(str[0]);
}
}
class MainClass {
public static void Main() {
string s = "this is a test";
RevStr rsOb = new RevStr();
Console.WriteLine("Original string: " + s);
Console.Write("Reversed string: ");
rsOb.displayRev(s);
Console.WriteLine();
回答
這是打印反轉的串的遞歸方法。要打印一個字符串str
反過來,首先打印str
沒有第一個字符反轉(遞歸步驟),然後打印第一個字符。
例如打印abcd
反轉,反轉打印bcd
這是dcb
然後打印a
(第一個字符)。
既然遞歸調用是第一次,只要字符串有內容,它就會遞歸地用一個較少的字符調用它自己。一旦完全沒有人物,電話一次打印一個字符。它打印倒退,因爲如果你把調用堆棧(一個較小的字符串)
displayRev("test")
displayRev("est")
displayRev("st")
displayRev("t")
displayRev("") // unwinds here
所以,如果你看每一個的第一個字母,並把它寫下來就成了,不同廠家,測試相反。
它拋出一個異常。
例如:
displayRev("bla");
displayRev("la");
displayRev("a");
//Now it gets an error
//The string.Length "a" is bigger than 0 (it´s 1)
//in displayRev(str.Substring(1, str.Length-1)); he wants to make a SubString beginning at the
//index 1 (the Second character), but the string contains only 1 character
//if-Statement have to look like:
if(str.Length > 1)
displayRev(str.Substring(1, str.Length-1));
else
return;
也許想遞歸的最簡單的方法是作爲一個堆棧。事實上,如果你搜索堆棧和遞歸,你會看到許多使用堆棧實現遞歸的方法。
在你的代碼中,你有效地剝離了第一個字符,然後將其餘部分推入堆棧。當條件滿足需要「彈出」堆棧時,它會爲堆棧中的每個元素執行Console.Write()
語句。在你的情況下,這意味着它將打印被推入堆棧的字符串的第一個字符。請記住,堆棧是以LIFO(Last In,First Out)命令處理的,因此這會導致以相反的順序處理字符串。
如果您第一次看到遞歸,堆棧並不是最簡單的方法。主要想法是將問題分解爲子問題,然後解決它們(可能通過相同的功能)。 – unkulunkulu
@unkulunkulu我之前做過「可能」的評論,因爲我只是想爲OP提供另一種方式來查看解決方案。在我看來,它肯定有助於獲得許多觀點,而不會提到堆棧的概念,因此不會爲遞歸的討論提供服務。 – McArthey
是的,正是因爲這個原因,我喜歡這個問題的所有答案:) – unkulunkulu
- 1. 遞歸:這個程序是如何工作的?
- 2. 這個遞歸如何工作?
- 3. 這個遞歸函數如何工作?
- 4. 遞歸在這裏如何工作?
- 5. 遞歸在這裏如何工作?
- 6. 這個遞歸C代碼是如何工作的?
- 7. `for`如何在這個遞歸Clojure代碼中工作?
- 8. 如何跟蹤這個C遞歸程序
- 9. 爲什麼這個遞歸程序工作?
- 10. 這個printf如何在這個程序中工作 - 在c中進行澄清?
- 11. 這個「打印心臟」程序如何在C中工作?
- 12. 如何處理這種遞歸程序
- 13. 爲什麼這個遞歸碼工作?
- 14. 這個程序是遞歸的嗎?如果沒有,我該如何遞歸?
- 15. 如何使C++遞歸程序終止
- 16. 這個程序是否是遞歸的?
- 17. 遞歸如何工作?
- 18. 遞歸如何工作
- 19. SQL遞歸如何工作?
- 20. Java程序遞歸不工作
- 21. 這個遞歸SQL CTE是如何工作的?
- 22. 這個字符串如何反向遞歸工作?
- 23. 這個遞歸數組置換函數是如何工作的?
- 24. 這個遞歸List扁平化工作如何?
- 25. 這個遞歸函數是如何在C++中運行的?
- 26. 解釋這個C程序的工作
- 27. 這個程序是如何工作的
- 28. 這個程序是如何工作的?
- 29. 如何讓這個Prolog程序工作
- 30. C程序設計:遞歸
這在技術上並不正確。它根本不打印'bcd'。它一次僅打印一個字符。遞歸實際上是允許我們向後打印的。它分別管理字符串的每個部分,然後對被壓入堆棧的字符串中的第一個字符執行'Console.Write()'操作。 – McArthey
@Mcarthey - 這是遞歸步驟。我基本上是在解釋背後的邏輯。不是使用堆棧的技術細節。當你再次打印'bcd'時,'cd'被反轉並打印出'b'。 –
@McArthey,你說錯了,解釋是完美的,它裏面沒有移動目標,它只是一個靜態定義。 – unkulunkulu