繁体   English   中英

使用 for 循环进行选择排序的递归

[英]Recursion using a for loop for selection sort

我有一个递归选择排序方法,并在另一种方法中进行了初始递归调用。 但是我在递归方法中使用了 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);
}

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

将您的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);
    }
}

这是一个奇怪的解决方案,不是我个人写的,但你仍然可以。

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

如果代码不能以这种方式工作,请确保包含using 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);
}

您的解决方案是递归的,因为为了确定每个阶段的值,您正在对方法本身进行一次调用。 更进一步,您可以尝试使for loop逻辑本身也是递归的。

像这样的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM