出于好奇编写了一个递归字符串反转函数,但是那里的 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(使用前将#替换为@)