遞推之猴子爬山

2021-08-10 22:52:34 字數 1447 閱讀 9572

遞推是利用問題本身所具有的遞推關係求解問題的方法。所謂遞推,是在命題歸納時,可以由數量分別為n-k,…,n-1的情形推得數量為n的情形,或者反過來由數量分別為i+k,…,i+1的情形推出數量為i的情形。

我們大家比較熟悉的應該就是斐波那契數列了;這裡給大家講一下稍微複雜一點的遞推——猴子爬山問題。

乙個猴子在一座有30級台階的小山坡上跳躍,猴子一步可以跳躍1級或者3級,試求上山一共有多少種不同的走法?

設爬k級台階的不同爬法有f(k)種,

(1)尋找f(k)的遞推關係。上山最後一步到達第30級台階完成上山,共有f(30)種不同的走法;到第30級台階之前呢?無非是在第29級(上跳1級就行了),有f(29)種;或者位於第27級(上跳3級就行了),有f(27)種;於是f(30)=f(29)+f(27);

以此類推,有以下遞推關係:

f(k)=f(k-1)+f(k-3) (k>3);

(2)確定初始條件

f(1)=1;

f(2)=2;

f(3)=2;

(3)code如下:

int main()

問題引申:設爬n級台階,一步有m種跨法,一步跨多少級均從鍵盤輸入,求共有多少種不同的爬法。

這是乙個分級遞推問題,設爬山t級台階的不同爬法為f(t),從鍵盤輸入的m個整數分別為x(1),x(2),x(3),.........,x(m)    (約定x(1)2)<...x(m)1)時,f(t)=0,f(x(1))=1  (初始條件)

當x(1)2)時,第1級遞推,f(t)=f(t-x(1))

當x(2)3)時,第2級遞推,f(t)=f(t-x(1))+f(t-x(2))

.......

一般地,當x(k)1),k=1,2,,...,m-1, 有第k級遞推:

f(t)=f(t-x(1))+f(t-x(2))+....+f(t-x(k))

當x(m)1))+f(t-x(2))+...+f(t-x(m))

當t=x(2)或x(3)...x(m)時,還要加1,因為t本身就是乙個一步到位的爬法,則 f(t)=f(t)+1;

我們所求的目標就是

f(n)=f(n-x(1))+f(n-x(2))+...+f(n-x(m))

再設計遞推的過程中可以把台階數記為陣列x(m+1)

main()

for(i=1;i<=x[1]-1;i++)

f[i]=0; //確定初始條件

x[m+1]=n;

f[x[1]]=1; //初始條件

for(k=1;k<=m;k++) //一共m種爬法,實現對每一種爬法的累加

for(t=x[k]+1;t<=x[m+1];t++)

printf("共有不同的爬法種數為:%d",f[n]-1); //因為用到了x[m+1],將他也看成了一步走法,所以減1

遞迴與遞推設計 猴子爬山問題 農夫圈羊問題

1.猴子爬山問題 乙個頑猴在一座有100級台階的小山上爬山跳躍,猴子上山一步可跳1級,或跳2級,試求上山的100級 台階有多少種不同的爬法。遞推演算法設計 一般地有遞推關係 f k f k 1 f k 3 k 3 初始條件有 f 1 1 即1 1。f 2 2 即2 1 1。2 2 f n f n 1...

python課程之猴子爬山演算法

猴子爬山乙隻頑猴在一座有n級台階的小山上爬山跳躍。上山時需從山腳至山頂往上跳n級台階,一步可跳1級,或跳2級,或跳3級,求上山有多少種不同的跳法?n 1000 輸入形式 請輸入台階數 輸出形式 跳法數 x 樣例輸入 請輸入台階數 20 樣例輸出 跳法數 121415 每一次都可以選擇1,2,3有3種...

「猴子分桃」常規遞推解法C

海灘上有一堆桃子,n 只猴子來分。第 1 只猴子把這堆桃子中的 1 個扔 入海中 浪費食物 然後將剩餘的桃子平均分成 2 份,最後這只猴子拿走了 1 份。第 2 只 猴子來了接著把剩下的桃子中的乙個扔入海中,然後把剩餘的桃子平均分成 2 份,開開心心拿走了 1 份。第 3 第 4 第 n 只猴子都是...