在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();
}}
因为只要字符串有内容,递归调用是第一个,它将递归地少调用一个字符。一旦所有字符都用完,调用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)顺序处理的,所以这导致以相反的顺序处理字符串。
看看这个链接是否有帮助:递归的动画,简单的字符串反转