簡體   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