首页 > 解决方案 > 使用 for 循环进行选择排序的递归

问题描述

我有一个递归选择排序方法,在另一种方法中进行了初始递归调用。但是我在递归方法中使用了 for 循环。如果我有一个 for 循环,它仍然是一种递归方法吗?如何在没有 for 循环的情况下递归地实现选择排序?

private static void SelectionSortRecursive(int[] Array, int n) // sorted in descending order recursively
{
    if (n >= Array.Length - 1)
        return;
    int max = n;
    for (int i = n + 1; i < Array.Length; i++)
    {
        if (Array[i] > Array[max])
            max = i;
    }

    swap(Array, n, max);
    SelectionSortRecursive(Array, n + 1);
}

排序算法工作并正确排序。

标签: c#recursion

解决方案


将循环留for在......仍然是递归的,因为您已经有一个递归调用,并且使用递归添加任何数量的非递归仍然会留下递归。

在没有循环的情况下实现上述内容for......可以完成。@Emaro 的答案是正确的,因为它在代码中没有显式for循环,但他使用的 LINQ 仍然是对数组的隐式有限非递归迭代......即循环。

所以如果你真的不想要一个循环,你可以用递归替换它。

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);
    }
}

这是一个奇怪的解决方案,不是我亲自写的,但是你去。


推荐阅读