實用演算法 基礎演算法 遞推法 01

2021-04-12 19:22:48 字數 2686 閱讀 9258

推關係式:

fn=g(f

n-1)

這就在數的序列中,建立起後項和前項之間的關係,然後從初始條件(或最終結果)入手,一步步地按遞推關係遞推,直至求出最終結果(或初始值)。很多程式就是按這樣的方法逐步求解的。如果對乙個試題,我們要是能找到後一項與前一項的關係並清楚其起始條件(最終結果),問題就好解決,讓計算機一步步算就是了,讓高速的計算機做這種重複運算,可真正起到「物盡其用」的效果。

遞推分倒推法和順推法兩種形式。一般分析思路:

if求解條件f1

then begin

由題意(或遞推關係)確定最終結果fa;

求出倒推關係式f

i-1=g'(fi);

i=n;

while 當前結果f

i非初始值f

1 do由f

i-1=g(f

1)倒推前項;

輸出倒推結果f

1和倒推過程;

end

else begin

由題意(或順推關係)確定初始值f1(邊界條件);

求出順推關係式f1=g(fi-1);

i=1;

while 當前結果fi非最終結果fn do由fi=g(fi-1)順推後項;

輸出順推結果fn和順推過程;

end;

一、倒推法

所謂倒推法,就是在不知初始值的情況下,經某種遞推關係而獲知問題的解或目標,再倒推過來,推知它的初始條件。因為這類問題的運算過程是一一對映的,故可分析得其遞推公式。然後再從這個解或目標出發,採用倒推手段,一步步地倒推到這個問題的初始陳述。

下面舉例說明。

[例1] 貯油點

一輛重型卡車欲穿過1000公里的沙漠,卡車耗油為1公升/公里,卡車總載油能力為500公升。顯然卡車一次是過不了沙漠的。因此司機必須設法在沿途建立幾個儲油點,使卡車能順利穿越沙漠,試問司機如何建立這些儲油點?每一儲油點應存多少油,才能使卡車以消耗最少油的代價通過沙漠?

演算法分析:

程式設計計算及列印建立的貯油點序號,各貯油點距沙漠邊沿出發的距離以及存油量。

no.        distance(k.m.)        oil(litre)

1                x x                x x

2                x x                x x

3                x x                x x

...              .....              ......

設dis[i]   為第i個貯油點至終點(i=0)的距離;

oil[i]   為第i個貯油點的存貯油量;

我們可以用倒推法來解決這個問題。從終點向始點倒推,逐一求出每個貯油點的位置及存油量。

下圖表示倒推時的返回點:

從貯油點i向貯油點i+1倒推的策略是,卡車在點i和點i+1間往返若干次。卡車每次返回i+1處時正好耗盡500公升汽油,而每次從i+1出發時又必須裝足500公升汽油。兩點之間的距離必須滿足在耗油最少的條件下使i點貯足i*500分公升汽油的要求(0<=i<=n-1)。具體地講,第乙個貯油點i=1應距終點i=0處500km且在該處貯藏500公升汽油,這樣才能保證卡車能由i=1處到達終點i=0處,這就是說

dis[1]=500        oil[1]=500;

為了在i=1處貯藏500公升汽油,卡車至少從i=2處開兩趟滿載油的車至i=1處。所以i=2處至少貯有2*500公升汽油,即oil[2]=500*2=1000。另外,再加上從i=1返回至i=2處的一趟空載,合計往返3次。三次往返路程的耗油量按最省要求只能為500公升。即d

12=500/3km

dis[2]=dis[1]+d

12=dis[1]+500/3

為了在i=2處貯存1000公升汽油,卡車至少從i=3處開三趟滿載油的車至i=2處。報以i=3處至少貯有3*500公升汽油,即oil[3]=500*3=1500。加上i=2至i=3處的二趟返程空車,合計5次。路途耗油量也應為500公升,即d

23=500/5,

dis[3]=dis[2]+d

23=dis[2]+500/5;

依此類推,為了在i=k處貯藏k*500公升汽油,卡車至少從i=k+1處開k趟滿載車至i=k處,即

oil[k+1]=[k+1]*500=oil[k]+500,加上從i=k處返回i=k+1的k-1趟返程空間,合計2k-1次。這2k-1次總耗油量按最省要求為500公升,即

dk,k+1=500/(2k-1)

dis[k+1]=dis[k]+d

k,k+1

=dis[k]+500/(2k-1);

最後,i=n至始點的距離為1000-dis[n],oil[n]=500*n。為了在i=n處取得n*500公升汽油,卡車至少從始點開n+1次滿載車至i=n,加上從i=n返回始點的n趟返程空車,合計2n+1次,2n+1趟的總耗油量應正好為(1000-dis[n])*(2n+1),即始點藏油為oil[n]+(1000-dis[n])*(2n+1)。

轉換為c語言程式如下:

#include

void main()

while(!(d>=1000));

dis[k]=1000;        /*置始點至終點的距離值*/

d1=1000-dis[k-1];    /*求i=n處至始點的距離*/

oil[k]=d1*(2*k+1)+oil[k-1];    /*求始點藏油量*/

for(i=0;i

基礎演算法之遞推法

一.倒推法 例1 儲油點 每次送油到儲存點,因為每次從n 1處出發至n處時都是攜帶500公升油,往返次數越少說明花掉的油最少。int main int k,d k為儲油點位置序號,d為累計終點至當前儲油點的距離 int oil 10 dis 10 儲油點的油量和離終點的距離 int i 輔助變數 k...

常用演算法 遞推法

遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為n的解,當n 1時,解或為已知,或能非常方便地得到解。能採用遞推法構 造演算法的問題有重要的遞推性質,即當得到問題規模為i 1的解後,由問題的遞推性質,能從已求得的規模為1,2,i 1的一系列解,構造出問題規模為 i的解。這...

演算法設計 之 遞推法

遞推法就是根據已知條件,分析推導出問題中的聯絡,然後一步一步進行推倒直至得到結果。根據具體問題我們需要選擇是正推還是逆推來解決問題。下面先舉乙個遞推中的經典例子,就是求兔子數量的問題 現有乙隻乙個月大的兔子,已知當兔子在第三個月大時每月就可以生下乙隻小兔子 好吧,就按兔子是無性繁殖的 求一年後兔子的...