在C语言中递归拆分数组
我试图提出一种分治算法来寻找数组中的最小元素,但递归代码对我来说有点让人费解 例如,使用以下伪代码:在C语言中递归拆分数组,c,arrays,recursion,C,Arrays,Recursion,我试图提出一种分治算法来寻找数组中的最小元素,但递归代码对我来说有点让人费解 例如,使用以下伪代码: 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 :=
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
程序R_MIN(A,n)
开始
如果(n=1),则
min:=A[0];
其他的
lmin:=R_MIN(A,n/2);
rmin:=R_MIN(&(A[n/2]),n-n/2);
如果(lmin
我的理解是我们将数组一分为二,除非我们有基本情况。然后我们计算出哪一半有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;
}
#包括
内部记录最小值(内部A[],内部长度)
{
最小整数,最小整数,最小整数;
如果(len==1)
返回[0];
其他的
{
lmin=rec_min(A,len/2);
rmin=rec_min(A+len/2,len-len/2);
如果(lmin它在数组的左半部分和右半部分上查找先前递归调用的最小值。当达到基本情况且数组的长度为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;
}
#包括
内部记录最小值(内部A[],内部长度)
{
最小整数,最小整数,最小整数;
如果(len==1)
返回[0];
其他的
{
lmin=rec_min(A,len/2);
rmin=rec_min(A+len/2,len-len/2);
if(lmin递归通常更容易理解,因为它需要一点距离。你需要在数组中找到最小值。如果你把大数组分成两半,最小值就是每一半最小值的最小值。这是这里的关键概念。这正是代码所做的。很自然地,你会想知道这“魔力”是如何实现的发生了这种情况,进入其中并不容易。然而,在大多数情况下,并不需要这样做。在引擎盖下,分裂为两半的原则是重复的,没有任何额外的干预(这就是递归的要点——一次又一次地调用同一代码)。它会在基本情况下停止-当只剩下一个数字时,因此最小值是数字本身(正如您所指出的,它可以被写入在剩下两个数字时停止-但这不是必需的,并且会强制在最后一步进行显式比较,从而增加代码的复杂性).递归通常可以通过距离来更好地理解。你需要在数组中找到最小值。如果你将大数组分成两半,最小值就是每一半最小值中的最小值。这是这里的关键概念。这正是代码所做的。很自然地,你会想知道这“魔力”是如何实现的发生了这种情况,进入其中并不容易。然而,在大多数情况下,并不需要这样做。在引擎盖下,分裂为两半的原则是重复的,没有任何额外的干预(这就是递归的要点——一次又一次地调用同一代码)。它会在基本情况下停止-当只剩下一个数字时,因此最小值是数字本身(正如您所指出的,它可以被写入在剩下两个数字时停止-但这不是必需的,并且会强制在最后一步进行显式比较,从而增加代码的复杂性).您应该尝试编写C版本,然后我们会看到。此伪代码与Pascal有惊人的相似性:)您应该尝试编写C版本,然后我们会看到。此伪代码与Pascal有惊人的相似性:)