遞迴和分治

2021-06-08 22:25:26 字數 1933 閱讀 6827

分治(divide and conquer)是基於多分枝遞迴的一種演算法。簡單的說就是把乙個大問題分解為多個型別相同的子問題,最後把這些子問題的解合併起來就是問題的解。

我們看一下典型的遞迴和分治演算法。

問題1: 插入排序的遞迴演算法

思路:1.首先找到突破點->> 如果共有n個數,如果前面n-1個都已排序,那麼我只要把最後乙個數插入到正確的位置即可。那如何讓前n-1個都已排序呢,如果前n-2個已排序就好了...........,一直到第乙個已排序,明顯的第乙個肯定是已排序的,那麼這就是停止條件。

2.當有了思路後,寫遞迴函式時一定要確信自己的遞迴函式沒錯,不要想如果錯了怎麼辦?,如sort(a,n-1),就是代表前n-1個數都已排序。

3.當合併資料時,直接考慮最後合併的情況。如當前n-1個數都是已排序的,那麼就考慮如何將最後乙個數插入到合適位置(如下merge函式)

#include using namespace std;

void merge(int a,int );

void sort(int a,int n) // n the num of a

}void merge(int a,int j)

void *b_search(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))

int comint(const void *f,const void *s)

int comchar(const void *s1, const void *s2)

int main()

;int key=1;

if(b_search(&key,a,10,sizeof(int),comint)!=null)

cout<<"find....\n";

char *s=;

char *ckey="yihaibo";

if(b_search(&ckey,s,4,sizeof(char*),comchar)!=null)

cout<<"find....";

cout<

問題3:求x的n次方

平時我們用for迴圈求x的n次方,那樣演算法時間複雜度為n,下面的遞迴版本時間複雜度為logn

#include using namespace std;

long power_recur(int base,int n)

else }

int main()

friend matrix operator*(const matrix& first,const matrix& second);

friend ostream& operator<<(ostream&,const matrix&);

};matrix operator*(const matrix& first,const matrix& second)

inline ostream& operator<<(ostream& out,const matrix& ret)

int partition(int a,int beg,int end)

int partition(void *base,int beg,int end,int size,int (*compar)(const void *,const void *))

} exchange((char*)base+(i+1)*size,(char*)base+end*size,size);

return i+1;

}void quick_sort(void *base,int beg,int end,int size,int (*compar)(const void *,const void *))

{ if(beg

親,return strcmp(*(char**)s1,*(char**)s2); 這個是(char**)一定要注意哦!!!

遞迴和分治

在高階語言中,函式自己呼叫和呼叫其他函式並沒有本質的不同。我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。不過,寫遞迴程式最怕的就是陷入永不結束的無窮遞迴中。切記,每個遞迴定義必須至少有乙個條件,當滿足這個條件時遞迴不再進行,即函式不再呼叫自身而是返回值。比如之前我們...

遞迴和分治策略

1.遞迴的概念 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。在計算機演算法設計與分析中,使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。對於大運算來說由於過程太多效率很低,且開銷大,常用遞推代替 編寫乙個遞迴函式,將10進製轉化成radix進製 輸出二...

遞迴和分治策略

直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。在計算機演算法設計與分析中,使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。對於大運算來說由於過程太多效率很低,且開銷大,常用遞推代替 編寫乙個遞迴函式,將10進製轉化成radix進製 輸出二進位制形式 in...