递归如何在这个C#程序中起作用?

时间:2011-07-28 06:44:59

标签: c#

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(); 

} }

4 个答案:

答案 0 :(得分:2)

由于递归调用是第一个,只要字符串具有内容,它将以少一个字符递归调用自身。一旦完全没有字符,调用就会一次打开一个字符。它向后打印,因为如果你采用调用堆栈(对于较小的字符串)

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

因此,如果您查看每个字母的第一个字母并将其写下来,则变为tset,与测试相反。

答案 1 :(得分:1)

这是一个递归方法,可以打印反转的字符串。要打印字符串str,首先打印str而不翻转第一个字符(递归步骤),然后打印第一个字符。

例如,打印abcd反转,打印bcd反转dcb,然后打印a(第一个字符)。

答案 2 :(得分: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; 

答案 3 :(得分:0)

考虑递归的最简单方法可能是Stack。实际上,如果您搜索Stack和递归,您将看到许多使用Stack实现递归的方法 在您的代码中,您实际上剥离了第一个字符,然后将剩余部分推入堆栈。当条件满足时,它需要“弹出”堆栈,它会对堆栈中的每个元素执行Console.Write()语句。在你的情况下,它意味着它将打印被推入堆栈的字符串的第一个字符。请记住,堆栈是以LIFO(后进先出)顺序处理的,因此这会导致以相反的顺序处理字符串。

查看此链接是否有帮助:The Animation of Recursion, Simple String Reversal