递归字符串反转函数

2023-12-15

出于好奇编写了一个递归字符串反转函数,但是那里的 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);
    }

它似乎干扰了我的弦的第一部分

“嘿,有堆栈!”变成“I♫→A←E↨reht yeh”

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

更新..

我想这里并不真正需要异或..所以使用了基本分配,也摆脱了返回。

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

递归几乎总是用来使问题变得更简单。递归算法本质上也通常是函数式的(尽管它们不是必须的)。

在反转字符串(或char[]),“更简单”意味着“在较小的数组上操作”。

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

"test"
"est"   't'
"st"    'e'
"t"     's'
""      't'

(左边是缩小后的数据;右边是剪切后的数据)。

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

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

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

    char [] restReversed = reverse(rest);

    // ???
}

我将让您自行决定下一步需要如何处理您所拥有的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归字符串反转函数 的相关文章

随机推荐