2011-07-28 35 views
1
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(); 

} }遞歸如何在這個C#程序中工作?

回答

1

這是打印反轉的串的遞歸方法。要打印一個字符串str反過來,首先打印str沒有第一個字符反轉(遞歸步驟),然後打印第一個字符。

例如打印abcd反轉,反轉打印bcd這是dcb然後打印a(第一個字符)。

+0

這在技術上並不正確。它根本不打印'bcd'。它一次僅打印一個字符。遞歸實際上是允許我們向後打印的。它分別管理字符串的每個部分,然後對被壓入堆棧的字符串中的第一個字符執行'Console.Write()'操作。 – McArthey

+0

@Mcarthey - 這是遞歸步驟。我基本上是在解釋背後的邏輯。不是使用堆棧的技術細節。當你再次打印'bcd'時,'cd'被反轉並打印出'b'。 –

+0

@McArthey,你說錯了,解釋是完美的,它裏面沒有移動目標,它只是一個靜態定義。 – unkulunkulu

2

既然遞歸調用是第一次,只要字符串有內容,它就會遞歸地用一個較少的字符調用它自己。一旦完全沒有人物,電話一次打印一個字符。它打印倒退,因爲如果你把調用堆棧(一個較小的字符串)

displayRev("test") 
displayRev("est") 
displayRev("st") 
displayRev("t") 
displayRev("") // unwinds here 

所以,如果你看每一個的第一個字母,並把它寫下來就成了,不同廠家,測試相反。

1

它拋出一個異常。

例如:

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; 
0

也許想遞歸的最簡單的方法是作爲一個堆棧。事實上,如果你搜索堆棧和遞歸,你會看到許多使用堆棧實現遞歸的方法。
在你的代碼中,你有效地剝離了第一個字符,然後將其餘部分推入堆棧。當條件滿足需要「彈出」堆棧時,它會爲堆棧中的每個元素執行Console.Write()語句。在你的情況下,這意味着它將打印被推入堆棧的字符串的第一個字符。請記住,堆棧是以LIFO(Last In,First Out)命令處理的,因此這會導致以相反的順序處理字符串。

看看這個鏈接幫助:The Animation of Recursion, Simple String Reversal

+1

如果您第一次看到遞歸,堆棧並不是最簡單的方法。主要想法是將問題分解爲子問題,然後解決它們(可能通過相同的功能)。 – unkulunkulu

+0

@unkulunkulu我之前做過「可能」的評論,因爲我只是想爲OP提供另一種方式來查看解決方案。在我看來,它肯定有助於獲得許多觀點,而不會提到堆棧的概念,因此不會爲遞歸的討論提供服務。 – McArthey

+0

是的,正是因爲這個原因,我喜歡這個問題的所有答案:) – unkulunkulu