无法理解C#中的递归函数

时间:2015-10-08 14:04:11

标签: c# recursion

我无法理解下面给出的代码的执行情况。当我们调用函数DisplayRev()时,它将检查参数的长度,然后它将分离第一个索引,然后再次使用剩余的字符串执行函数。在字符串长度大于零之前,最后的语句不会执行。

Console.Write(str[0]);的功能是什么以及什么时候执行?

class RevStr {  
  // Display a string backward.  
   public void DisplayRev(string str) {    
     if (str.Length > 0)      
       DisplayRev(str.Substring(1, str.Length - 1));    
     else      
       return;   

     Console.Write(str[0]);  
   } 
} 

class RevStrDemo {  
  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 :(得分:3)

真的很容易理解。假设您调用这样的函数:

DisplayRev("Hello");

字符串的长度为5(大于0),因此它调用自身,传入一个新字符串。这个新字符串是原始字符串减去第一个字母,因此调用变为:

DisplayRev("ello");

然后它再次执行,遵循相同的过程:

DisplayRev("llo");

然后:

DisplayRev("lo");

然后:

DisplayRev("o");

现在是神奇的部分。它开始写字符串中的第一个字母:

所以DisplayRev("o");o。然后函数返回,DisplayRev("lo");写出第一个字母l。因此,您的屏幕不显示ol。然后函数返回,DisplayRev("llo");写入第一个字母l,屏幕显示oll,然后函数返回,DisplayRev("ello");打印第一个字母{{1} }。现在屏幕显示e。最后,原始呼叫打印出第一个字母,' H'屏幕显示olle

顺便说一下,这对学习递归的工作方式很有帮助,但是有更简单的方法来反转字符串,例如:

olleH

答案 1 :(得分:0)

我认为看一个简单的例子是个好主意:DisplayRev("CAT")

首先执行DisplayRev("AT")然后打印C。因此,打印C将是方法所做的最后事情。

以同样的方式,DisplayRev("AT")首先DisplayRev("T")然后打印A(但这会在打印C之前发生)。

DisplayRev("T")首先DisplayRev("")然后打印T(但这会在AC打印之前发生)

DisplayRev("")不会打印任何内容,因为字符串为零时的长度。

因此我们看到该方法将以相反的顺序打印字母。

答案 2 :(得分:0)

当函数以递归方式调用自身时,每个字母将在写出之前等待字符串的其余部分被处理,这导致字符串被反向写入。

0的长度是终止条件,它使所有先前的值能够以相反的顺序完成它们的执行。

把它想象成堆栈,或者如果你是一般的编程新手,比如机架中的一堆盘子。你将它们从堆叠中取出(原始的字母顺序),然​​后将它们放在机架上。当需要使用这些印​​版时,尽管最初是第一个印版,它仍然必须等待其上面的所有东西首先使用,所以顺序是相反的。

最好的办法是逐步完成,你应该能够理解这个问题。

答案 3 :(得分:-4)

如果你传递一个像" ABCDEF"它将编写" FEDCBA"在控制台上。