C# 使用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循环。如果我有一个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,最大值);
选择或递归(数组,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循环的情况下递归地实现选择排序?”这对于这个站点来说是一个过于宽泛的问题。(我甚至怀疑这是否可能)