我无法理解下面给出的代码的执行情况。当我们调用函数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();
}
}
答案 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
(但这会在A
或C
打印之前发生)
DisplayRev("")
不会打印任何内容,因为字符串为零时的长度。
因此我们看到该方法将以相反的顺序打印字母。
答案 2 :(得分:0)
当函数以递归方式调用自身时,每个字母将在写出之前等待字符串的其余部分被处理,这导致字符串被反向写入。
0的长度是终止条件,它使所有先前的值能够以相反的顺序完成它们的执行。
把它想象成堆栈,或者如果你是一般的编程新手,比如机架中的一堆盘子。你将它们从堆叠中取出(原始的字母顺序),然后将它们放在机架上。当需要使用这些印版时,尽管最初是第一个印版,它仍然必须等待其上面的所有东西首先使用,所以顺序是相反的。
最好的办法是逐步完成,你应该能够理解这个问题。
答案 3 :(得分:-4)
如果你传递一个像" ABCDEF"它将编写" FEDCBA"在控制台上。