遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的乙個重要演算法。這種演算法特點是:乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係(即遞推式),那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。這種處理問題的方法能使複雜運算化為若干步重複的簡單運算,充分發揮出計算機擅長於重複處理的特點。
遞推演算法的首要問題是得到相鄰的資料項間的關係(即遞推關係)。遞推演算法避開了求通項公式的麻煩,把乙個複雜的問題的求解,分解成了連續的若干步簡單運算。一般說來,可以將遞推演算法看成是一種特殊的迭代
【例1】數字三角形。如下所示為乙個數字三角形。請編乙個程式計算從頂到底的某處的一條路徑,使該路徑所經過的數字總和最大。只要求輸出總和。
1、 一步可沿左斜線向下或右斜線向下走; 2
、 三角形行數小於等於
100; 3
、 三角形中的數字為0,
1,…,
99;
測試資料通過鍵盤逐行輸入,如上例資料應以如下所示格式輸入: 5
73 8
8 1 0
2 7 4 4
4 5 2 6 5
【演算法分析】
此題解法有多種,從遞推的思想出發,設想,當從頂層沿某條路徑走到第
i層向第
i+1層前進時,我們的選擇一定是沿其下兩條可行路徑中最大數字的方向前進,為此,我們可以採用倒推的手法,設a[i
][j]
存放從i,j
出發到達
n層的最大值,則a[i
][j]=max
,a[1][1]
即為所求的數字總和的最大值。
【參考程式】
#include<
iostream
>
using namespace
std;
intmain()
cout
}【例2】滿足f1=f2=1,fn=fn-1+fn-2的數列稱為斐波那契數列(fibonacci),它的前若干項是1,1,2,3,5,8,13,21,34……求此數 列第n項(n>=3)。
即:f1=1
(n=1
)f2=1
(n=2
)fn=fn-1 + fn-2
(n>=3)
程式如下:
#include<
iostream
>
#include<
cstdio
>
using namespace
std;
intmain()
printf("%d\n",f2);
return 0; }
【例3】有2χn的乙個長方形方格,用乙個1*2的骨牌鋪滿方格。
編寫乙個程式,試對給出的任意乙個n(n>0),輸出鋪法總數。
【演算法分析】
(1)面對上述問題,如果思考方法不恰當,要想獲得問題的解答是相當困難的。可以用遞推方法歸納出問題解的一般規律。
(2)當n=1時,只能是一種鋪法,鋪法總數有示為x1=1。
(3)當n=2時:骨牌可以兩個並列豎排,也可以並列橫排,再無其他方法,如下左圖所示,因此,鋪法總數表示為x2=2;(4
)當n=3
時:骨牌可以全部豎排,也可以認為在方格中已經有乙個豎排骨牌,則需要在方格中排列兩個橫排骨牌(無重複方法),若已經在方格中排列兩個橫排骨牌,則必須在方格中排列乙個豎排骨牌。如上右圖,再無其他排列方法,因此鋪法總數表示為
x3=3。
由此可以看出,當
n=3時的排列骨牌的方法數是
n=1和
n=2排列方法數的和。 (
5)推出一般規律:對一般的
n,要求
xn可以這樣來考慮,若第乙個骨牌是豎排列放置,剩下有
n-1個骨牌需要排列,這時排列方法數為
xn-1
;若第乙個骨牌是橫排列,整個方格至少有
2個骨牌是橫排列(
1*2骨牌),因此剩下
n-2個骨牌需要排列,這是骨牌排列方法數為
xn-2
。從第一骨牌排列方法考慮,只有這兩種可能,所以有: x
n=xn-1+x
n-2(
n>2)
x1=1 x2
=2 xn
=xn-1
+xn-2
就是問題求解的遞推公式。任給
n都可以從中獲得解答。例如
n=5, x
3=x2+x
1=3 x
4=x3+x
2=5 x
5=x4+x
3=8
下面是輸入n,輸出x1
~xn
的c++程式:
#include<iostream>
using namespacestd;
intmain()
}
下面是執行程式輸入n=30,輸出的結果:
input n: 30
x[1]=1
x[2]=2
x[3]=3
........
x[29]=832040
x[30]=1346269
問題的結果就是有名的斐波那契數。
第二章 遞推演算法
乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。這種處理問題的方法能使複雜運算化為若干步重複的簡單運算,充分發揮出計算機...
演算法設計與分析 遞推演算法
遞推法的概念 遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的乙個重要演算法。這種演算法特點是 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知...
演算法設計與分析2 遞推演算法
遞推法是一種重要的數學方法。這種演算法特點是 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。遞推演算法的首要問題是得到...