在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有惊人的相似性:)