【问题标题】:Recursively splitting an array in C在C中递归拆分数组
【发布时间】:2016-11-29 05:20:09
【问题描述】:

我正在尝试提出一种分而治之的算法来查找数组中的最小元素,但递归代码对我来说有点费解。

例如,取如下伪代码:

 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 中会是什么样子?在我看来,这只有在我们分成对时才有效。

【问题讨论】:

  • 你应该尝试写C版本,然后我们会看到。
  • 这个伪代码与 Pascal 惊人的相似:)

标签: c arrays recursion


【解决方案1】:

它从数组的左半部分和右半部分的先前递归调用中找到最小值。当达到基本情况并且数组的长度为 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;
}

【讨论】:

    【解决方案2】:

    递归通常通过稍远一点的距离来更好地理解。您需要找到数组中的最小值。如果将大数组分成两半,则最小值将是每半最小值中的最小值。这是这里的关键概念。这正是代码的作用。很自然地想知道这种“魔法”是如何发生的,并且融入其中并不容易。但是,在大多数情况下不需要它。在引擎盖下,重复分成两半的原则没有任何额外的干预(这就是递归的点 - 一次又一次地调用相同的代码)。它在基本情况下停止 - 当只剩下一个数字时,所以最小值是数字本身(它可以被写成在剩下 2 个数字时停止,就像你提到的那样 - 但这不是必需的,并且会强制执行最后一步是显式比较,增加了代码的复杂性)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多