遞迴的概念
乙個函式、過程、概念或資料結構,如果在其定義或說明內部直接或間接地出現有其本身的引用,或者是為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的上一狀態……這種用自己來定義的方法,稱之為遞迴或者遞迴定義。
在程式設計中,過程或函式直接或者間接呼叫自己,就稱為遞迴呼叫
遞迴過程實際上借助於乙個遞迴工作棧來實現的。
首先問題向乙個方向一步一步分解,既問題規模逐漸降低,這樣,問題向一極推進的過程稱之為遞迴過程;
然後這些問題又按後提出先解決的順序依次得到解決,最後得到原問題的解。這樣,在子問題得到逐一解決的基礎上,最後回到原問題的解的變化過程,稱之為回歸過程。
遞迴定義的要素
1、遞迴邊界或終止條件。
2、遞迴定義,使問題向邊界條件轉化的規則。
varn:integer;
function fibonacci(x:integer):integer;
begin
if (x=0) or (x=1) then exit(1);
exit(fibonacci(x-1)+fibonacci(x-2));
end;
begin
readln(n);
writeln(fibonacci(n));
end.
集合的劃分
設s是乙個具有n個元素的集合,s={a1,a2,……,an},現將s劃分成k個滿足下列條件的子集合s1,s2,……,sk ,且滿足:
1.si≠φ
2.si∩sj=φ (1≤i,j≤k i≠j)
3.s1∪s2∪s3∪…∪sk=s
則稱s1,s2,……,sk是集合s的乙個劃分。它相當於把s集合中的n個元素a1 ,a2,……,an 放入k個(0
先舉個例子,設s={1,2,3,4},k=3,不難得出s有6種不同的劃分方案,即劃分數s(4,3)=6,具體方案為:
{1,2}∪{3}∪{4}
{1,3}∪{2}∪{4}
{1,4}∪{2}∪{3}
{2,3}∪{1}∪{4}
{2,4}∪{1}∪{3}
{3,4}∪{1}∪{2}
考慮一般情況,對於任意的含有n個元素a1 ,a2,……,an的集合s,放入k個無標號的盒子中去,劃分數為s(n,k),我們很難憑直覺和經驗計算劃分數和列舉劃分的所有方案,必須歸納出問題的本質。
下面考慮對任乙個元素an,則必然出現以下兩種情況:
1、{an}是k個子集中的乙個,於是我們只要把a1,a2,……,an-1 劃分為k-1子集,便解決了本題,這種情況下的劃分數共有s(n-1,k-1)個;
2、{an}不是k個子集中的乙個,則an必與其它的元素構成乙個子集。則問題相當於先把a1,a2,……,an-1 劃分成k個子集,這種情況下劃分數共有s(n-1,k)個;然後再把元素an加入到k個子集中的任乙個中去,共有k種加入方式,這樣對於an的每一種加入方式,都可以使集合劃分為k個子集,因此根據乘法原理,劃分數共有k*s(n-1,k)個。
綜合上述兩種情況,應用加法原理,得出n個元素的集合{a1,a2,……,an}劃分為k個子集的劃分數為以下遞迴公式:
s(n,k)=s(n-1,k-1)+k*s(n-1,k) (n>k,k>0)。
確定s(n,k)的邊界條件
首先不能把n個元素不放進任何乙個集合中去,即k=0時,s(n,k)=0;
也不可能在不允許空盒的情況下把n個元素放進多於n的k個集合中去,即k>n時,s(n,k)=0;
再者,把n個元素放進乙個集合或把n個元素放進n個集合,方案數顯然都是1,即k=1或k=n時,s(n,k)=1。
可以得出劃分數s(n,k)的遞迴關係式為:
s(n,k)=s(n-1,k-1)+k*s(n-1,k) (n>k,k>0)
s(n,k)=0 (n
遞迴與非遞迴的轉化
在遞迴呼叫的過程中,由於要保留每次呼叫時的引數和區域性變數,而且要經過逐層呼叫和逐層返回兩大過程,程式對於時間和儲存空間的耗費可以說是巨大的。因此,在乙個問題對於時空要求較高的情況下,有時不得不將遞迴方法轉化成非遞迴方法,這一過程,常常稱之為消除遞迴。消除遞迴的過程,其本質上就是要求模擬複雜的遞迴工作棧的變化過程,雖然遞迴與非遞迴在形式上大多能夠相互轉化,但是,非遞迴的程式設計難度要遠遠高於遞迴的方法 遞推
在問題型別中,每個資料項都和它前面的若干個資料項(或後面的若干個資料項)有一定的關聯,這種關聯一般是通過乙個遞推關係式來表示的。求解問題時就從初始的乙個或若干個資料項出發,通過遞推關係式逐步推進,從而得到最終結果。這種求解法就叫遞推法
演算法框架
1、確定求解初始條件
2、求出遞推公式
3、從邊界出發進行順推或倒推
4、輸出結果
具體詳見:
遞推和遞迴
貪心的思想可以用一句話來歸納,每步取優 很好理解,假設你的程式要走i 1 n共n步,那麼保證你的第i步走出的是當前這一步的最優值。這樣的解題方法叫做貪心演算法。可見貪心演算法並不是乙個全面的列舉方法而是若干結果中的一種,僅僅一種而已。但這種演算法是不是最優解它就不能完全保證了。一般每個可以使用遞迴演...
遞推和遞迴
一 遞推演算法基本思想 遞推演算法是一種理性思維模式的代表,其根據已有的資料和關係,逐步推導而得到結果。遞推演算法的執行過程如下 1 根據已有的 結果和關係,求解中間結果 2 判定是否達到要求,如果沒有達到,則繼續根據已知結果和關係求解中間結果 如果滿足要求,則表示尋找到乙個正確的答案。遞推演算法往...
遞迴和遞推
從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資料範圍 1 n 15 ...