任何乙個可以用計算機求解的問題所需的計算時間都與其規模n有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。
分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
如果原問題可分割成k個子問題(1<k≤n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。
由分治法產生的子問題往往是原問題的較小模式,這就為使用遞迴技術提供了方便。
程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法(recursion)。
乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量
遞迴需要有邊界條件、遞迴前進段和遞迴返回段。
當邊界條件不滿足時,遞迴前進;
當邊界條件滿足時,遞迴返回。
注意:在使用遞增歸策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口,否則將無限進行下去(死鎖)。
遞迴的缺點:
遞迴演算法解題的執行效率較低。
在遞迴呼叫過程中,系統為每一層的返回點、區域性變數等開闢了堆疊來儲存。遞迴次數過多容易造成堆疊溢位等。
fibonacci數列
;//採用陣列儲存中間結果
void
fibonacci
(int n)
集合的全排列問題
設r= 是要進行排列的n個元素,顯然共有n!種排列。
令ri=r-。集合x中元素的全排列記為perm(x),則(ri)perm(x) 表示在全
排列perm(x)的每乙個排列前加上字首ri得到的排列。
r的全排列可歸納定義如下:
當n=1時,perm(r)=(r), 其中r是集合r中唯一的元素;
當n>1時,perm(r) 由(r1)perm(r1),(r2)perm(r2), ···,(rn )perm(n)構成。
依此遞迴定義,可設計產生perm(r)的遞迴演算法。
//產生從元素k~m的全排列,作為前k—1個元素的字尾
void
perm
(int list,
int k,
int m)
else
//在陣列list中,產生從元素k~m的全排列
for(
int j=k;j<=m;j++
)}
演算法設計與分析 遞迴
遞迴是一種技術手段,並不嚴格算是一種演算法,是指程式直接間接呼叫自身的程式設計技巧。遞迴需要有邊界條件,遞迴前進段和遞迴返回段。1 當邊界條件不滿足時,遞迴前進 2 當邊界條件滿足時,遞迴返回。ps 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,成為遞迴出口,否則將無限進行下去 遞迴的缺點 遞迴演...
演算法分析與設計 遞迴與尾遞迴
什麼是遞迴?遞迴最恰當的比喻,就是查詞典。我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你...
演算法分析設計 遞迴演算法
what s the 遞迴演算法 定義 程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法 recursion 乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多...