繁体   English   中英

在C中递归拆分数组

[英]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.

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