我有一个递归选择排序方法,另一个方法中有一个初始递归调用。但是我在递归方法中使用了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);
}
排序算法可以正常工作并进行排序。
答案 0 :(得分: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);
}
}
这是一个奇怪的解决方案,不是我个人写的,但是您仍然可以使用。
答案 1 :(得分:0)
使用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。本地var应该是小写的骆驼。样本:
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);
}
答案 2 :(得分:0)
您的解决方案是递归的,即在确定每个阶段的值时,您都对方法本身进行了一次调用。更进一步,您可以尝试使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;
}