遞推是利用問題本身所具有的遞推關係求解問題的方法。所謂遞推,是在命題歸納時,可以由數量分別為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 只猴子都是...