演算法設計與分析 第一章 遞迴演算法

2021-10-05 18:10:17 字數 2254 閱讀 9942

緒論:

演算法的五大特性:

⑴ 輸入:乙個演算法有零個或多個輸入。

⑵ 輸出:乙個演算法有乙個或多個輸出。

⑶ 有窮性:乙個演算法必須總是在執行有窮步之後結束,且每一步都在有窮時間內完成。

⑷ 確定性:演算法中的每一條指令必須有確切的含義,對於相同的輸入只能得到相同的輸出。

⑸ 可行性:演算法描述的操作可以通過已經實現的基本操作執行有限次來實現。

時間複雜性分析的關鍵:

問題規模:輸入量的多少;

基本語句:執行次數與整個演算法的執行時間

成正比的語句

遞迴演算法:

【例1】數字三角形。如下所示為乙個數字三角形。請編乙個程式計算從頂到底的某處的一條路徑,使該路徑所經過的數字總和最大。只要求輸出總和。

1、 一步可沿左斜線向下或右斜線向下走;

2、 三角形行數小於等於100;

3、 三角形中的數字為0,1,…,99;

測試資料通過鍵盤逐行輸入,如上例資料應以如下所示格式輸入:57

3 88 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

using

namespace std;

intmain()

cout<

[1]<

}

【例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

#include

using

namespace std;

intmain()

printf

("%d\n"

,f2)

;return0;

}

【例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。從第一骨牌排列方法考慮,只有這兩種可能,所以有:

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

x1=1

x2=2

xn=xn-1+xn-2就是問題求解的遞推公式。任給n都可以從中獲得解答。例如n=5,

x3=x2+x1=3

x4=x3+x2=5

x5=x4+x3=8

下面是輸入n,輸出x1~xn的c++程式:

#include

using

namespace std;

intmain()

}

輸出的陣列結果即為fibonacci序列

演算法設計與分析 第一章演算法概論

可由乙個給定計算模型機械地執行的規則或計算步驟序列稱為該計算模型的乙個計算 演算法是滿足下列條件的計算 輸出 滿足給定約束條件地結果 演算法的目的是求解問題 乙個演算法面向乙個問題,而不是僅求解乙個問題的乙個或幾個例項 偽 例項 input a 1,n n個數 output a 1,n n個sort...

演算法設計與分析複習 第一章 演算法引論

1,什麼是演算法?演算法有哪些基本特徵?請指出演算法同程式的相同點與不同點。答 演算法是解決問題的方法或過程,是滿足以下四個性質的指令序列 1 輸入 有 0 個以上的輸入 2 輸出 至少有 1 個輸出 3 確定性 指令清晰 無歧義 4 有限性 指令執行次數有限,時間有限 5 可行性 演算法和程式的相...

演算法設計技巧與分析筆記 第一章

1.搜尋 設a 1 n 為乙個n個元素的陣列,判定給定元素x是否在a中 線性搜尋 直接掃瞄a中所有專案,將每個專案與x做比較。二分搜尋 a low high 為有序非空陣列 假定為公升序 a mid 為中間元素 演算法分析 時間複雜度 o log n 2.排序 設a 1 n 為乙個n個元素的陣列,將...