在c#程序中递归是如何工作的

本文关键字:工作 何工作 程序 递归 | 更新日期: 2023-09-27 18:03:41

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#程序中递归是如何工作的

因为只要字符串有内容,递归调用是第一个,它将递归地少调用一个字符。一旦所有字符都用完,调用unwind,每次打印一个字符。它是反向打印的,因为如果你取调用堆栈(对于较小的字符串)

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

所以如果你看每一个的第一个字母并把它写下来它就变成了,tset, test的反面

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

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

抛出异常。

的例子:

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; 

考虑递归最简单的方法可能是将其视为堆栈。事实上,如果你搜索Stack和递归,你会看到很多使用Stack实现递归的方法。
在您的代码中,您有效地剥离了第一个字符,然后将其余部分推入堆栈。当它需要"弹出"堆栈的条件满足时,它会对堆栈上的每个元素执行Console.Write()语句。在你的例子中,这意味着它将打印被压入堆栈的字符串的第一个字符。记住,堆栈是按照后进先出(LIFO)顺序处理的,所以这导致以相反的顺序处理字符串。

看看这个链接是否有帮助:递归的动画,简单的字符串反转