遞推演算法
乙個問題的求解需一系列(類似重複)的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係。通過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。
在解決問題的時候,去尋找前後過程之間的數學關係(即遞推式)。
遞推演算法避開了求項公式的麻煩,把乙個複雜的問題的求解,分解成了連續的若干步簡單運算。
遞推演算法分為順推和逆推兩種。
小問題:
1.樓梯有n個台階,上樓可以選擇一下上乙個或兩個台階。
問:一共有多少種上樓的方法?
解: 設:爬x個台階有f(x)種方法
如今有n個台階,方法種類:f(n)
第一步:
選擇邁一步:還剩n-1個台階,那麼此時有f(n-1)種方法
選擇邁兩步,還剩n-2個台階,那麼此時有f(n-2)種方法
可得:n個台階時:f(n)=f(n-1)+f(n-2) 以此類推
那麼就得到遞推式了,注意邊界情況:f(1)=1,f(2)=2
得到遞推式時,要注意n的取值範圍。此時n >= 3。
2.現有一對雌雄各一的兔子,雌兔在出生兩個月後才能生育,且每月產雌雄各一的一對兔子。
問:n個月後共有多少只兔子?
解:設:(x,y)為未成年的兔子,(x,y)為成年的兔子。
第x個月的兔子數為f(x) x>0 f(1)==1
f(2)==1
第一月:( x1,y1 )
第二月:( x1,y1 ) //第一對兔子成年
第三月:( x1,y1 )->( x2,y2 ) //出生第二對兔子
第四月:( x1,y1 )->( x3,y3 ) ( x2,y2 )
第五月: ( x1,y1 )->( x4,y4 ) ( x3,y3 ) ( x2,y2 ) ->(
x5,y5 )
第六月: ( x1,y1 )->( x6,y6 ) ( x2,y2 )->( x7,y7
)( x3,y3)->( x8,y8 ) ( x4,y4 ) ( x5,y5 )
可得規律:
每乙個月的兔子數=老兔子數+新兔子;
=上個月的兔子數+新兔子數;
=上個月的兔子數+上上月的兔子數;
所以:f(n)=f(n-1)+f(n-2);
再考慮n的取值範圍和邊界情況: n>=3
f(1)==1 f(2)==1
3.先有一條2n的過道,用12規格的瓷磚鋪路。
問:有多少種鋪法?
解: 第一步:設未知量
設:長度為x的過道有f(x)種鋪法。
第二步:老規矩(找規律)
當n=1時:f(1)==1;
當n=2時:f(2)==2;
當n=3時:f(3)==3;
當n=n時:
鋪第一塊磚時,是橫鋪還是豎鋪?
豎著鋪時:鋪完第一塊還有n-1塊,那麼還有f(n-1)種情況
橫著鋪時:鋪完第一塊那麼可以間接確定第二塊也是橫著鋪著的,只需再考慮f(n-2)種情況。
第三部:
得遞推式:f(n)=f(n-1)+f(n-2);
再加上取值範圍和邊界情況即可。
**區:
#include
using
namespace std;
intmain()
return0;
}
//這個程式顯示從1到n每個情況的鋪路方法數。
例題:輸入:x,y,z。0<=x<=20,1<=y<=20,x<=z<=50.
輸出:z個月後的成蟲數。
開始只有一對成蟲,每對成蟲x個月產y對卵,每對卵要過兩個月長成成蟲。本體中成蟲不死,卵長成成蟲後的第乙個月不產卵(過x個月產卵)
問:過z個月後,共有成蟲多少對?
分析: n代表成蟲,n代表幼蟲
第乙個月: n1
第x個月: n1
第x+1個月: n1 —> n(2—y+1)
第x+3個月: n1 --> n(2—y+1)
第2x+1個月: n1 --> n(y+2—2y+1) n(2—y+1)
第2x+3個月: n1—>n(2y+2—3*y+1)
n(2---y+1)-->(3*y+2---(3+y)*y+1)
n(y+2---2*y+1)
設第x個月的成蟲數f(x) f(1)到f(z+2)都是1
且f(x+3)==1+y;
成蟲數=上上月的幼蟲數+上個月的成蟲數;
=z+2個月前的成蟲數*y+上個月的成蟲數;
f(n)=f(n-1)+f(n-z+2)
**區:
#include
using
namespace std;
intmain()
for(month=x+
1;month<=z+1;
++month)
cout<
}
總結:1.設f(x)2.找規律(順推或逆推)
3.得到遞推式+邊界情況+x的取值範圍
遞推演算法二
b align center size medium 遞推演算法二 冪積數列 size align b size medium b 冪積數列 b m 輸入整數n,m求小於n的按從小到大的第m個元素 分析 list b 窮盡法 b 從2開始到n,如果n 2 0,n n 2一直迴圈的直到不能除盡 n 3...
遞推演算法(2)
有 2n 的乙個長方形方格,用乙個12 的骨牌鋪滿方格 編寫乙個程式,試對給出的任意乙個n n 0 輸出鋪法總數。演算法分析 1 當n 1時,只能是一種鋪法,鋪法總數有示為x1 1。2 當n 2時 骨牌可以兩個並列豎排,也可以並列橫排,再無其他方法,如下左圖所示,因此,鋪法總數表示為x2 2 3 當...
遞推演算法 骨牌填充
題目 在2 n的乙個長方形方格中,用乙個2 1的骨牌鋪滿方格,例如n 3時,為2 3方格,骨牌的鋪放方案有三種 如圖 求 輸入n,輸出鋪放方案的總數 分析 可以把2 1的骨牌看成乙個整體,可以豎著放,也可以橫著放。2 n 的骨牌的填充 1 可以由2 n 1 的骨牌最後加上一張豎2 1的骨牌,此時的填...