第三章 遞迴與分治策略

2021-10-03 20:54:06 字數 1858 閱讀 1785

程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法。

它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。

遞迴演算法解題的執行效率較低。

在遞迴呼叫過程中,系統為每一層的返回點、區域性變數等開闢了堆疊來儲存。遞迴次數過多容易造成堆疊溢位等。

當邊界條件不滿足時,遞迴前進;

當邊界條件滿足時,遞迴返回。

注意:在使用遞增歸策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口,否則將無限進行下去。

//產生從元素k~m的全排列,作為前k—1個元素的字尾

void perm(int list, int k, int m)

,則呼叫perm(list,2,4) 就是產生元素3~5的全排列。

整數劃分問題是演算法中的乙個經典命題之一。把乙個正整數n表示成一系列正整數之和:

正整數n的這種表示稱為正整數n的劃分。正整數n的不同劃分個數稱為正整數n的劃分數,記作正整數6有11種不同的劃分 

if(i>=j) //沒有發現交換物件

break;

swap(a[i],a[j]);

}if(j-left+1==k)

return pivot;

a[left]=a[j]; //儲存pivot

a[j]=pivot;

if(j-left+1給定乙個自然數n,由n開始可以依次產生半數集set(n)中的數如下。

(1) n 屬於set(n);

(2) 在n的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半;

(3) 按此規則進行處理,直到不能再新增自然數為止。

例如,set(6)=。

半數集set(6)中有6個元素。

注意半數集是多重集。

對於給定的自然數n,程式設計計算半數集set(n)中的元素個數。

設set(n)中的元素個數為,則顯然有:

int comp(int n)

int a[1001];

int comp(int n)

第三章 遞迴

遞迴是一種強大的方法,它允許乙個物件以其自身更小的形式來定義自己。恐怕沒有什麼比觀察神秘的自然界中出現的遞迴現象更好的方法來體會遞迴的重要意義了。想想蕨類植物的葉子,每片葉子的小枝幹都是整片葉子的較小縮影 又或者兩個反光的物體,相互對映對方的漸遠的影像。這樣的例子使我們明白儘管大自然的力量是強大的,...

第三章 遞迴

今天看了演算法 第三章遞迴 寫一下收貨 省著以後忘 遞迴就是不斷的呼叫自己 如果使用迴圈,程式效率會更高,如果使用遞迴,程式可能更容易被理解 遞迴的基線條件和遞迴條件 1.遞迴條件 自己呼叫自己 2.基線條件 如何讓自己停下來 push eitem 元素入棧 push方法 元素入棧 public e...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...