[英]Recursively splitting an array in C
我试图提出一种分而治之的算法来查找数组中的最小元素,但是递归代码对我来说有点麻烦。
例如,采用以下伪代码:
procedure R_MIN (A, n)
begin
if (n = 1) then
min := A[0];
else
lmin := R_MIN (A, n/2);
rmin := R_MIN (&(A[n/2]), n - n/2);
if (lmin < rmin) then
min := lmin;
else
min := rmin;
endelse;
endelse;
return min;
end R_MIN
我的理解是,除非有基本情况,否则我们将数组分成两半。 然后,我们找出哪一部分具有最小值,然后重复调用,并将其进一步拆分(现在有4个数组)。 但是实际在哪里找到min的方式是什么,在C语言中此代码将是什么样? 在我看来,这只有在我们分成两半时才有效。
它从数组左半部分和右半部分的先前递归调用中找到最小值。 当达到基本情况并且数组的长度为1时,这就是该长度为1的子数组的最小值。然后取该最小值并将其与另一半的最小值进行比较。 两者中的较低者是该子阵列的最小值。 返回以进行比较,依此类推...
如果将伪代码转换为C:
#include <stdio.h>
int rec_min(int A [],int len)
{
int min,lmin,rmin;
if(len==1)
return A[0];
else
{
lmin=rec_min(A,len/2);
rmin=rec_min(A+len/2,len-len/2);
if(lmin<rmin)
return lmin;
else
return rmin;
}
}
int main()
{
int test [10]={3,2,7,4,5,8,1,9,6,10};
printf("%d\n",rec_min(test,10));
return 0;
}
通常,从一点点距离就可以更好地理解递归。 您需要在数组中找到最小值。 如果将大数组分成两半,则最小值将是每个最小值的最小值。 这是这里的关键概念。 这正是代码的作用。 很自然地想知道这种“魔术”是如何发生的,而住进去并不是那么容易。 但是,在大多数情况下并不需要。 在引擎盖下,重复分成两半的原理,而无需任何其他干预(这就是递归的意义-一次又一次地调用相同的代码)。 它在基本情况下停止-当仅剩一个数字时,最小数为数字本身(如您所指出的,当剩下两个数字时,它可能被编写为停止-但这不是必需的,而是会强制这样做作为最后一步的显式比较,这会增加代码的复杂性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.