第一章 遞推演算法

2021-09-28 05:09:28 字數 3451 閱讀 5622

遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的乙個重要算。

特點:

已知條件所求問題之間總存在著某種相互聯絡的關係,如果可以找到前後過程之間的數量關係(即遞推式),那麼,從問題出發逐步推到已知條件,此種方法叫逆推。

無論順推還是逆推,其關鍵是要找到遞推式

fibonacci 數列:0,1,1,2,3,5,8,13,21,34,……

遞推關係:

f0 = 0

f1 = 1

fn = fn-1 + fn-2 ( n >= 2 )

實現**:

#include

using

namespace std ;

intmain()

if( n >

(i-1)*

2) cout << a0+a1 << endl ;

return0;

}

求n層漢諾塔的移動次數

遞推關係:

f(n)=2*f(n-1)+1

邊界條件:

f(1)=1

實現**:

#include

using

namespace std;

intmain()

;int n;

cin>>n;

for(

int i=

2;i<=n;i++

) f[i]=2

*f[i-1]

+1; cout<

}

問題描述:猴子第一天採摘了一些桃子,第二天吃了第一天的一半多乙個,第三天吃了第二天的一半多乙個…直到第十天就剩下乙個。問:猴子第一天摘了多少桃子?

遞推關係:

f(n)=f(n-1)/2-1

f(n-1)=(f(n)+1)*2

邊界條件:

f(10)=1

**實現:

#include

using

namespace std;

intmain()

問題描述:名名的媽媽從外地出差回來,帶了一盒好吃又精美的巧克力給名名(盒內共有 n 塊巧克力,20 > n >0)。

媽媽告訴名名每天可以吃一塊或者兩塊巧克力。假設名名每天都吃巧克力,問名名共有多少種不同的吃完巧克力的方案。

演算法分析:

如果n=1,則名名第1天就吃掉它,共有1種方案;

如果n=2,則名名可以第1天吃1塊,第2天吃1塊,也可以第1天吃2塊,共有2種方案;

如果n=3,則名名第1天可以吃1塊,剩2塊,也可以第1天吃2塊剩1塊,所以名名共有2+1=3種方案;

如果n=4,則名名可以第1天吃1塊,剩3塊,也可以第1天吃2塊,剩2塊,共有3+2=5種方案。

f[i] = f[i - 1] + f[i - 2]

**實現:

#include

using

namespace std;

intmain()

; f[1]

=1; f[2]

=2;for

(int i =

3; i <=

20; i++

)int n;

while

(cin >> n)

return0;

}

問題描述:

科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。

每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。

假設每個成蟲不死,第乙個月只有一對成蟲,且卵長成成蟲後的第乙個月不產卵(過x個月產卵).

問過z個月以後,共有成蟲多少對?0=演算法分析:

每個月都有成蟲產卵。

蟲卵經過兩個月才能變成成蟲,產卵。

每個月的成蟲數量是?

由前上個月的成蟲和兩個月之前的蟲卵數量計算

每個月的蟲卵是由i-x個月的成蟲決定(i是當前月份。為什麼不是上個月的成蟲?)

定義陣列f,f[i]表示第i月昆蟲成蟲的數量

新增乙個輔助陣列b,b[i]表示第i月的卵的數目,從而得到兩個公式:

b[i] = f[i - x] * y; (成蟲經過x月產卵 y對)f[i] = f[i - 1] + b[i - 2]; (卵經過2個月長成成蟲)

**實現:

#include

using

namespace std;

intmain()

,b[101]=

,i,j,x,y,z;

cin>>x>>y>>z;

for(i=

1;i<=x;i++

)for

(i=x+

1;i<=z+

1;i++)

cout<

}

問題描述:

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。

input

一行,包含二個整數m和n,以空格分開。1<=m,n<=10。

output

用一行輸出相應的k。

演算法分析:

設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,

當n>m:

必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)  

當n<=m:不同的放法可以分成兩類:

1、有至少乙個盤子空著,即相當於

f(m,n) = f(m,n-1);

2、所有盤子都有蘋果,相當於可以從每個盤子中拿掉乙個蘋果,不影響不同放法的數目,即

f(m,n) = f(m-n,n).

而總的放蘋果的放法數目等於兩者的和,即

f(m,n)=f(m,n-1)+f(m-n,n)

邊界條件說明:

當n=1時,

所有蘋果都必須放在乙個盤子裡,所以返回1;

當沒有蘋果可放時,

定義為1種放法;

**實現:

#include

using

namespace std;

intmain()

for(

int i=

0;i<=n;

++i)

dp[0]

[i]=1;

//蘋果0個時,定義為1種情況

for(

int i=

1;i<=m;

++i)

} cout<[n]

}

第一章 遞推演算法

特點 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。猴子吃桃 遞推關係 f n f n 1 2 1 f n 1 f n 1 2 ...

第一章 遞推演算法

解題方法 在已知條件和所求問題之間總存在著某種相互聯絡的關係,關鍵是前後過程之間的數量關係 即遞推式 然後進行順推或逆推。1.求斐波那契數列的前n項和 fibonacci 數列 0,1,1,2,3,5,8,13,21,34,f0 0 f1 1 fn fn 1 fn 2 n 2 關鍵 int n,i,...

演算法基礎第一章

不同常數時間的操作 加或定址運算或位運算 執行時間不一樣 選擇最小的數,放到陣列的第乙個位置 時間複雜度 c n c n 1 c n 2 c 1 o n 2 額外空間複雜度 o 1 兩兩比較並交換,直到無交換 時間複雜度 o n 2 額外空間複雜度 o 1 左邊序列有序,右邊新加入乙個數,從右往左找...