C# 反转字符串
我只是在研究如何反转字符串。我在完整的参考书C#中找到了一个程序,但我无法理解它。有人能解释一下它是怎么工作的吗 节目如下:C# 反转字符串,c#,logic,reverse,C#,Logic,Reverse,我只是在研究如何反转字符串。我在完整的参考书C#中找到了一个程序,但我无法理解它。有人能解释一下它是怎么工作的吗 节目如下: using System; class RevStr { // Display a string backward. public void DisplayRev(string str) { if(str.Length > 0) DisplayRev(str.Substring(1, str.Len
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))代码>对于字符串中的每个字符
我的建议 你试过
myString.Reverse()吗代码>
这是在C#(.NET3.5及更高版本)中反转字符串的最简单方法
响应
对于您的示例,它使用删除结束字符(通过在删除第一个字符的情况下创建原始字符的子字符串)来显示每个字符,然后再次调用自身,直到没有剩余字符为止
您只需调用DisplayRev代码>一次,因为它递归地显示其中的每个字符
解释尝试
例如,我们有字符串“hello”
第一次调用将使用“hello”
的子字符串递归调用函数,该子字符串将是“ello”
请注意,尚未调用Console.WriteLine,因为函数DisplayRev
已被调用,因此我们随后进入递归调用
这将一直发生,直到字符串为空(.Length==0
)。然后该函数将退出并返回给调用者,其中字符串[0]为“o”,控制台为。将点击WriteLine
代码将“o”写入控制台,然后退出该函数,该函数的调用者将点击控制台。WriteLine
,控制台为“l”,这将一直返回,直到到达初始调用
从而导致您的初始字符串被反转
参考
有很多关于递归的教程。这里有几个(他们会比我更善于解释):
没有
它使用递归调用
DisplayRev用少一个字符调用自己
当它到达末尾,并从递归返回时,它将打印字符
还请注意,它只是显示混响的字符串,而不是实际混响它为什么不使用字符串的内置功能呢
string s = "123";
s = s.Reverse();
这个程序只是输出反转的字符串,它不会以任何方式修改字符串。
下面是它的工作原理——它基于递归。如果从位置1开始打印初始字符串的子字符串的反转(即str.substring(1,str.Length-1)),然后打印字符串的第一个字符,则整个字符串将反转。显然,该函数对于长度为1的字符串是正确的,之后,您可以使用归纳法和上述观察证明,给定函数将正确打印所有长度的反转字符串
但是,如果您不坚持自己实现字符串,则有一个内置函数可以反转字符串:
str.Reverse();
类中的内部发生了什么。请仔细查看
看到有子字符串函数正在使用两个参数调用
是字符串的长度[这里只有一个字符
串中的位置
然后打印出那个字符。它是一个递归调用,所以它会一直发生,直到字符串长度不为零
这是对同一函数的递归调用
基本上,它依赖于这样一个事实,即直到返回对DisplayRev
的上一次调用,才调用Console.Write
命令
每次调用DisplayRev都会传递一个已删除第一个字符的字符串:
为了
给出“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")
进行试运行:
输入字符串=“这是一个测试”
递归反向函数调用:
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"
反转字符串(最有效的算法):下面不处理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);
}
公共静态字符串反转(字符串源){
char[]s=orig.ToCharArray();
int n=s.长度;
int半长=n/2;
对于(int i=0;i
很多人似乎都想这样做……一种巧妙的方法是使用数组。相反
将字符串传递给一个字符数组,使用array。反向,然后将字符数组作为字符串传回
Public static string ReverseString(string str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
return new string(arr);}
这是递归的一个例子。这本书大概讨论了递归?我们不会解释整个程序。请确切地告诉我们您不理解的内容。显然,此代码不是如何反转字符串的示例。这是递归的演示!然而,上升的选票却源源不断!今天我还没来得及完成我的回答,鳄鱼就出局了!这个问题的答案是@user试图学习递归
Public static string ReverseString(string str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
return new string(arr);}