我正在研究如何反转字符串。我在C#完整参考书中找到了一个程序,但我无法理解它。 Plz任何人解释我的工作原理
该计划在这里:
using System;
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();
}
}
rsOb.DisplayRev(s);
是否为字符串中的每个字符调用DisplayRev(str.Substring(1, str.Length-1));
?答案 0 :(得分:6)
我推荐的内容
您是否尝试过myString.Reverse();
这是在C#(.Net 3.5及更高版本)中反转字符串的最简单方法。
<强>响应强>
至于你的例子,它使用Recursion
通过删除结束字符来显示每个字符(通过创建删除了第一个字符的原始子字符串)然后再次调用自己,直到没有字符剩余。< / p>
您只需要调用DisplayRev(s);
一次,因为它会递归显示其中的每个字符。
解释尝试
例如,我们有字符串"hello"
。
第一个调用将以substring
的{{1}}递归调用该函数,该函数将为"hello"
请注意,尚未调用Console.WriteLine,因为函数"ello"
已被调用,因此我们将进入递归调用。
这将继续发生,直到字符串为空(DisplayRev
)。然后该函数将退出并返回到调用者,调用者将是字符串[0]所在的位置&#34; o&#34;,.Length == 0
代码将被写入&#34; o&#34;在控制台上,此功能将被退出,然后调用者将会点击Console.WriteLine
,这将是&#34; l&#34;,这将一直返回,直到达到初始调用。< / p>
因此导致你的初始字符串,反转。
<强>参考强>
有很多关于递归的教程。这里有一些(他们在解释它时比我更好):
答案 1 :(得分:3)
没有
它使用递归调用
DisplayRev 使用少一个字符
调用自身当它结束时,返回来自递归 - 它会打印出char。
另请注意,它只是显示了被尊敬的字符串而不是实际上尊重它
答案 2 :(得分:1)
在课堂内发生了什么。仔细查看
看到有子串函数正在调用两个参数。
答案 3 :(得分:1)
这是对同一函数的递归调用。
基本上它依赖于Console.Write
命令在前一次调用DisplayRev
之后才被调用的事实。
每次调用DisplayRev都会传递一个已移除第一个字符的字符串: 对于
str = "abcdef"
str.Substring(1, str.Length-1)
给出"bcdef"
Console命令写入第一个字符(str [0])。
到处理最后一次DisplayRev调用时,str [0]为“f”。
然后所有的呼叫都会回到第一个呼叫,有很多显示,例如:
Console.Write("f")
Console.Write("e")
Console.Write("d")
Console.Write("c")
Console.Write("b")
Console.Write("a")
答案 4 :(得分:0)
为什么不使用string的内置功能?
string s = "123";
s = s.Reverse();
答案 5 :(得分:0)
这个程序只是输出反转的字符串,它不会以任何方式修改字符串。 它是如何工作的 - 它基于递归。如果打印从位置1开始的初始子串的反向(即str.Substring(1,str.Length-1)),然后打印字符串的第一个字符,最终会使整个字符串被反转。显然,对于长度为1的字符串,该函数是正确的,之后您可以使用归纳法和上述观察证明给定函数将打印正确反转所有长度的字符串。
但是,如果您不坚持自己实现字符串,则有一个内置函数来反转字符串:
str.Reverse();
答案 6 :(得分:0)
干涸:
输入字符串=“这是一个测试”;
递归反向函数调用:
public void DisplayRev(string str)
{
if(str.Length > 0)
DisplayRev(str.Substring(1, str.Length-1));
else
return;
Console.Write(str[0]);
}
带参数的堆栈调用如下:
DisplayRev("t") // ----> prints "t"
DisplayRev("st") // ----> prints "s" ----> complete string "ts"
DisplayRev("est") // ----> prints "e" ----> complete string "tse"
DisplayRev("test") // ----> prints "t" ----> complete string "tset"
DisplayRev(" test") // ----> prints " " ----> complete string "tset "
DisplayRev("a test") // ----> prints "a" ----> complete string "tset a"
DisplayRev(" a test") // ----> prints " " ----> complete string "tset a "
DisplayRev("s a test") // ----> prints "s" ----> complete string "tset a s"
DisplayRev("is a test") // ----> prints "i" ----> complete string "tset a si"
DisplayRev(" is a test") // ----> prints " " ----> complete string "tset a si "
DisplayRev("s is a test") // ----> prints "s" ----> complete string "tset a si s"
DisplayRev("is is a test") // ----> prints "i" ----> complete string "tset a si si"
DisplayRev("his is a test") // ----> prints "h" ----> complete string "tset a si sih"
DisplayRev("This is a test")// ----> prints "t" ----> complete string "tset a si siht"
答案 7 :(得分:0)
反转字符串(最有效的算法):以下内容不涉及UTF-16代理项对。
public static String reverse(String orig){
char[] s = orig.ToCharArray();
int n = s.Length;
int halfLength = n / 2;
for (int i = 0; i < halfLength; i++){
char temp = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] = temp;
}
return new String(s);
}
答案 8 :(得分:0)
很多人似乎想要这样做......一个巧妙的方法是利用Array.Reverse
将字符串传递给char数组,使用Array.Reverse然后将char数组作为字符串传回。
Public static string ReverseString(string str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
return new string(arr);}