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個不相同的...