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