【问题标题】:Reversing a String反转字符串
【发布时间】:2012-02-02 11:04:48
【问题描述】:

我只是在研究如何反转字符串。我在 C# The Complete Reference Book 中找到了一个程序,但我无法理解它。请任何人解释一下它是如何工作的

节目在这里:

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();
    }
}
  1. 这个程序是如何工作的?
  2. 语句rsOb.DisplayRev(s); 是否为字符串中的每个字符调用DisplayRev(str.Substring(1, str.Length-1));

【问题讨论】:

  • 是递归的一个例子。大概这本书谈到了递归?
  • 我们不会解释整个程序。请准确地告诉我们您不理解的地方。

标签: c# logic reverse


【解决方案1】:

我的推荐

你试过myString.Reverse();

这将是在 C#(.Net 3.5 及更高版本)中反转字符串的最简单方法。

回应

对于您的示例,它使用Recursion 通过删除结束字符(通过创建原始的子字符串并删除第一个字符)来显示每个字符,然后再次调用自身,直到没有剩余字符为止。

您只需调用一次DisplayRev(s);,因为它会递归地显示其中的每个字符。

解释尝试

例如我们有字符串"hello"

第一次调用将使用substringsubstring 递归调用函数,这将是"ello"

请注意,尚未调用 Console.WriteLine,因为函数 DisplayRev 已被调用,因此我们随后进入递归调用。

这将继续发生,直到字符串为空 (.Length == 0)。然后该函数将退出并返回给调用者,这将是字符串 [0] 为“o”的位置,Console.WriteLine 代码将被击中,将“o”写入控制台,然后该函数将退出并且然后调用者将点击Console.WriteLine,这将是“l”,这将继续返回,直到到达初始调用。

因此导致您的初始字符串反转。

参考

有很多关于递归的教程。这里有一些(他们会比我更擅长解释):

Recursion Example 1
Recursion Example 2

【讨论】:

  • 显然这段代码不是如何反转字符串的示例。这是递归的演示!然而,赞成票流淌!
  • 今天我还没来得及完成我的答案,鳄鱼就出来了!
【解决方案2】:

没有。

它使用递归调用

DisplayRev 用少一个字符调用自己

当它到达结尾,并从递归中返回 - 它打印字符。

另外请注意,它只是显示了reveresed字符串,而实际上revere了它

【讨论】:

    【解决方案3】:

    类里面发生了什么。仔细看
    看到有子字符串函数正在调用两个参数。

    1. 是字符串的长度[这里只有一个字符]
    2. 字符串中的位置
      然后它打印那个字符。并且它是一个递归调用,所以它会发生直到字符串长度不为零。

    【讨论】:

      【解决方案4】:

      这是对同一个函数的递归调用。

      基本上,它依赖于 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")
      

      【讨论】:

        【解决方案5】:

        为什么不使用字符串的内置功能?

        string s =  "123";
        s = s.Reverse();
        

        【讨论】:

        • 这个问题的答案是@user 正在尝试学习递归
        【解决方案6】:

        这个程序只是简单地输出反转的字符串,它不会以任何方式修改字符串。 这是它的工作原理 - 它基于递归。如果您打印从位置 1 开始的初始子字符串的反向(即 str.Substring(1, str.Length-1)),然后打印字符串的第一个字符,您最终会得到整个字符串被反转.显然,该函数对于长度为 1 的字符串是正确的,之后您可以使用归纳法和上述观察证明给定函数将打印所有长度的正确反转的字符串。

        但是,如果您不坚持自己实现它,那么有一个内置函数可以反转字符串:

        str.Reverse();
        

        【讨论】:

          【解决方案7】:

          进行试运行:

          输入字符串 = "这是一个测试";

          递归反向函数调用:

          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"
          

          【讨论】:

            【解决方案8】:

            反转字符串(最有效的算法):以下不处理 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);
            }
            

            【讨论】:

              【解决方案9】:

              很多人似乎都想这样做……一种巧妙的方法是利用 Array.Reverse

              将字符串传递给 char 数组,使用 Array.Reverse 然后将 char 数组作为字符串传回。

              Public static string ReverseString(string str)
              {
              char[] arr = str.ToCharArray();
              Array.Reverse(arr);
              return new string(arr);}
              

              【讨论】:

                猜你喜欢
                • 2016-01-06
                • 1970-01-01
                • 2020-02-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多