出于好奇写了一个递归的字符串反转函数,但在 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);
// ???
}
我会留给您来决定下一步需要用您拥有的数据做什么。
关于c# - 递归字符串反转函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424551/