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

2021-10-09 11:12:01 字數 1546 閱讀 3060

1.1.2遞迴應滿足的條件

1.1.3何時使用遞迴

① 直接遞迴 自己呼叫自己的遞迴

②間接遞迴 a呼叫b,b呼叫a

如果乙個遞迴過程或遞迴函式中遞迴呼叫語句是最後一條執行語句,則稱這種遞迴呼叫為尾遞迴。

例1.1 設計求n!(n為正整數)的遞迴演算法

int

fun(

int n)

這是乙個直接遞迴,又由於遞迴呼叫是最後一條語句,所以它又屬於尾遞迴

1 乙個問題可以轉化為乙個或多個子問題來求解,而這些子問題的求解方法與原問題完全相同,只是在數量和規模上不同

2 遞迴呼叫的次數必須是有限的

3 必須有結束遞迴的條件來終止遞迴

a.定義是遞迴的

數學定義,數列和概念是定義遞迴的,如求n!,斐波那契額數列等

b.資料結構是遞迴的

資料結構的定義是遞迴的,如單鏈表

typedef

struct lnodelinklist;

該結點型別定義中,結構體lnode的定義用到了他自身,即指標域next是一種指向自己型別的指標。

例1.2 求單鏈表l的所有data域(假設為int型)之和的遞迴演算法
int

sum(linklist* l)

例1.3 分析二叉樹的二叉鏈儲存結構的遞迴行,求非空二叉bt中所有結點值之和的遞迴演算法,假設二叉鏈的data域為int型。
typedef

struct bnodebtnode;

bt指向根節點

bt->lchild 左孩子節點

bt->rchild 右孩子節點

而左右孩子本身也是二叉樹,它是一種遞迴資料結構

求非空二叉鏈bt中所有結點值之和的遞迴演算法如下

int

sumbt

(btnode *bt)

c.問題的求解方法是遞迴的

例1.4 漢諾塔問題

該問題描述是:設有3個

分別命名為x、y和z的塔座,在塔座x上有n個直徑各不相同,從小到大依次編號為1,2,.,n的碟片,現要求將x塔座上的n個碟片移到塔座z.上並仍按同樣順序疊放,碟片移動時必須遵守以下規則:每次只能移動乙個碟片;碟片可以插在x、y或z中任- -塔座;任何時候都不能將–個較大的碟片放在較小的碟片上。設計遞迴求解演算法。

設hanoi(n,x,y,z)表示將n個碟片從x通過y移動到z上,遞迴分解的過程

hanoi(n-1,x,z, y);

hanoi(n, x,y,z)

move(n, x,z):將第n個圓盤從x移到z;

hanoi(n-l,y, x,z)

#include

void

move

(int n,

char a,

char b,

char c)

}main()

演算法設計與分析 第二章 遞推演算法

遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的乙個重要演算法。這種演算法特點是 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法...

演算法導論 第二章 遞迴與分治

階乘函式 斐波那契數列 include include include using namespace std 階乘函式 int fact int n 斐波那契數列 int fib int n int main 階乘 斐波那契 排列問題 include include include include...

《演算法設計與分析》 演算法第二章上機實踐報告

開門見山,直接上題目。7 2 改寫二分搜尋演算法 20 分 設a 0 n 1 是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。輸入有兩行 第一行是n值和x值 第二行是n個不相同的...