C# 使用for循环进行选择排序的递归
我有一个递归选择排序方法,在另一个方法中有一个初始递归调用。但是我在递归方法中使用了for循环。如果我有一个for循环,它仍然是一个递归方法吗?C# 使用for循环进行选择排序的递归,c#,recursion,C#,Recursion,我有一个递归选择排序方法,在另一个方法中有一个初始递归调用。但是我在递归方法中使用了for循环。如果我有一个for循环,它仍然是一个递归方法吗? 如何在没有for循环的情况下递归实现选择排序 private static void selectionsorrecursive(int[]数组,int n)//按降序递归排序 { if(n>=Array.Length-1) 返回; int max=n; for(int i=n+1;i数组[max]) max=i; } 交换(数组,n,最大值); 选择
如何在没有for循环的情况下递归实现选择排序
private static void selectionsorrecursive(int[]数组,int n)//按降序递归排序
{
if(n>=Array.Length-1)
返回;
int max=n;
for(int i=n+1;i数组[max])
max=i;
}
交换(数组,n,最大值);
选择或递归(数组,n+1);
}
排序算法正常工作并正确排序。使用linq方法Max()选择最大整数。使用Skip()可以确保在请求最大值时跳过已排序的元素。此代码没有循环
private static void SelectionSortRecursive(int[] Array, int n)
{
if (n >= Array.Length - 1)
return;
var max = System.Array.IndexOf(Array, Array.Skip(n).Max());
swap(Array, n, max);
SelectionSortRecursive(Array, n + 1);
}
如果代码不能以这种方式工作,请确保使用System.Linq包含代码>位于文件顶部
编辑
修正indexOf并跳过值
您需要键入System.Array,因为本地变量也称为Array。本地变量应为小写。样本:
private static void SelectionSortRecursive(int[] array, int n)
{
if (n >= array.Length - 1)
return;
var max = Array.IndexOf(array, array.Skip(n).Max());
swap(array, n, max);
SelectionSortRecursive(array, n + 1);
}
将您的循环留在。。。仍然是递归的,因为您已经有了一个递归调用,并且使用递归添加任意数量的非递归仍然会留下递归
private static void SelectionSortRecursive(int[] arr, int n)
{
if (n >= arr.Length - 1)
return;
int max = n;
Max(n + 1);
swap(arr, n, max);
SelectionSortRecursive(arr, n + 1);
void Max(int i)
{
if (i == arr.Length)
return;
if (arr[i] > arr[max])
max = i;
Max(i + 1);
}
}
在没有for
循环的情况下实现上述功能。。。这是可以做到的@Emaro的答案是正确的,因为代码中没有显式的for
循环,但他使用的LINQ仍然是数组上的隐式有限非递归迭代。。。i、 e.一个循环
所以如果你真的不想要一个循环,你可以用递归来代替它
private static void SelectionSortRecursive(int[] arr, int n)
{
if (n >= arr.Length - 1)
return;
int max = n;
Max(n + 1);
swap(arr, n, max);
SelectionSortRecursive(arr, n + 1);
void Max(int i)
{
if (i == arr.Length)
return;
if (arr[i] > arr[max])
max = i;
Max(i + 1);
}
}
这是一个奇怪的解决方案,不是我个人写的,但你还是要这样做。你的解决方案是递归的,因为要在每个阶段确定值,你需要对方法本身进行一次调用。更进一步,您可以尝试使for循环
逻辑本身也是递归的
大概是这样的:
private static void SelectionSortRecursive(int[] Array, int n) // sorted in descending order recursively
{
if (n >= Array.Length - 1)
return;
int max = n;
max = Compare(Array, max, n+1);
swap(Array, n, max);
SelectionSortRecursive(Array, n + 1);
}
private static int Compare(int[] arr, int max, int i)
{
if(i == arr.Length)
return max;
if (arr[i] > arr[max])
max = i;
max = Compare(arr,max,++i);
return max;
}
for循环是迭代。从selectionsorrecursive
调用selectionsorrecursive
本身就是递归,最终也是如此。实际上,这两种方法都可以。“我如何在没有for循环的情况下递归地实现选择排序?”这对于这个站点来说是一个过于宽泛的问题。(我甚至怀疑这是否可能)