递归字符串反转函数

Son*_*oul 4 c# string recursion

出于好奇而编写递归字符串反向函数,但在那里有一些XOR问题.这个函数的重点是不使用迭代器,这就是它是递归函数的原因.这不是功课,只是好奇心.

    private static char[] ReverseNL(char[] arr, int index)
    {
        var len = arr.Length;
        if (index > 0)
            arr[len - index] ^= arr[index - 1];
        return index-- < 1 ? arr : ReverseNL(arr, index);
    }
Run Code Online (Sandbox Code Playgroud)

它似乎堵塞了我的字符串的第一部分

"嘿那里堆叠!" 成为"我♫→A←E↨rehtyeh"

它总是被混乱的短语的前半部分......

UPDATE ..

我想这里并不真正需要XOR ..所以使用了基本的任务,也摆脱了回归.

    private static void ReverseNL(char[] arr, int index) {
        var len = arr.Length;
        if (index > 0 && index > len / 2) {
            var c = arr[len - index];
            arr[len - index] = arr[index - 1];
            arr[index - 1] = c;
            index--;
            ReverseNL(arr, index);
        }
    }
Run Code Online (Sandbox Code Playgroud)

str*_*ger 7

递归几乎总是用于使问题更简单.递归算法通常也具有功能性(尽管它们不一定是这样).

在反转字符串(或a char[])的情况下,"更简单"意味着"在较小的阵列上操作".

例如,您可以按如下方式减少:

"test"
"est"   't'
"st"    'e'
"t"     's'
""      't'
Run Code Online (Sandbox Code Playgroud)

(左边是数据减少;右边是剪切数据).

在伪代码中,您可以按如下方式执行缩减:

char[] reverse(char[] data) {
    if (data.Count() == 0) {
        return new char[] { };
    }

    char cut = data.First();
    char[] rest = data.Skip(1);

    char [] restReversed = reverse(rest);

    // ???
}
Run Code Online (Sandbox Code Playgroud)

我将由您自己决定使用您拥有的数据来确定接下来需要做什么.


Edw*_*eno 6

可能不是最有效的,但这应该给你一些关于如何使递归工作的想法......

    static string ReverseNL (string s)
    {
        if ((s == null) || (s.Length <= 1))
        {
            return s;
        }
        return ReverseNL(s.Substring(1)) + s[0];
    }

    static void Main(string[] args)
    {
        string src = "The quick brown fox";
        Console.WriteLine(src);
        src = ReverseNL(src);
        Console.WriteLine(src);
    }
Run Code Online (Sandbox Code Playgroud)