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)
递归几乎总是用于使问题更简单.递归算法通常也具有功能性(尽管它们不一定是这样).
在反转字符串(或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)
我将由您自己决定使用您拥有的数据来确定接下来需要做什么.
可能不是最有效的,但这应该给你一些关于如何使递归工作的想法......
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)