遞迴和遞推

2021-07-03 22:13:06 字數 2718 閱讀 9921

遞迴的概念

乙個函式、過程、概念或資料結構,如果在其定義或說明內部直接或間接地出現有其本身的引用,或者是為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的上一狀態……這種用自己來定義的方法,稱之為遞迴或者遞迴定義。

在程式設計中,過程或函式直接或者間接呼叫自己,就稱為遞迴呼叫

遞迴過程實際上借助於乙個遞迴工作棧來實現的。

首先問題向乙個方向一步一步分解,既問題規模逐漸降低,這樣,問題向一極推進的過程稱之為遞迴過程;

然後這些問題又按後提出先解決的順序依次得到解決,最後得到原問題的解。這樣,在子問題得到逐一解決的基礎上,最後回到原問題的解的變化過程,稱之為回歸過程。

遞迴定義的要素

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 ...