Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反转字符串_C#_Logic_Reverse - Fatal编程技术网

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

我只是在研究如何反转字符串。我在完整的参考书C#中找到了一个程序,但我无法理解它。有人能解释一下它是怎么工作的吗

节目如下:

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);}