120 likes | 342 Views
資料結構設計與 C++ 程式應用 Fundamentals of Data Structures and Their Applications Using C++. 第 5 章 遞迴. 資料結構設計與 C++ 程式應用 版權所有 禁止重製. 遞迴. 遞迴函數 乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n × (n-1)!
E N D
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第5章 遞迴 資料結構設計與C++程式應用 版權所有 禁止重製
遞迴 • 遞迴函數乃是一個自己反覆呼叫自己的函數 • 一個典型的遞迴演算法 n! = n× (n-1)! = n× (n-1) × (n-2)! = n× (n-1) ×(n-2) × (n-3)! = … = n× (n-1) ×(n-2) ×(n-3) × … ×2 ×1 1. 階乘函數一直自己呼叫自己,且引數依序由 n、n-1、n-2、…逐次遞減。 2. 當引數等於 1 時停止遞迴呼叫。
遞迴 //-------------------------------------- // n階層函數,採用遞迴演算法 //-------------------------------------- long factorial(long n) { if (n == 1) return 1; else return n * factorial(n-1) ; } //------------------------------------- // n階層函數,採用for迴路 //------------------------------------- long factorial(long n) { long f = 1; for(int i = n; i > 1; i--) f *= i; return f; }
遞迴 • 遞迴演算法需考量的因素: 1.遞迴函數的參數有哪些?每次呼叫之初值為何? 2.遞迴函數的回傳(Return)值為何? 3遞迴函數自己反覆地呼叫自己,那麼何時該結束呢?
常見的遞迴應用 • 1 費氏數列(Fibonacci) a0 = 1, a1 = 1。 an= an-1 + an-2 , 當n > 1。 // 求費氏數列第an項之值,採用遞迴演算法 long fibonacci(long n){ if(n = = 0) return 1; if(n = = 1) return 1; else return (fibonacci(n-1) + fibonacci(n-2)); }
常見的遞迴應用 • 2 求最大公因數GCD 1. 判斷兩數中哪一個比較大,大的當被除數,小的當除數。 2. 把被除數除以除數,得到商及餘數。 3. 若餘數等於 0 則 GCD = 小數。 否則 令小數成為新的被除數,餘數成為新的除數, 重複步驟 2。
常見的遞迴應用 // 求GCD之遞迴函數 int gcd(int dividend, int divisor) { int remainder ; if (dividend < divisor){ // 找出兩數之大者當被除數 swap(dividend, divisor) ;} // 小者當除數 if(divisor !=0) { remainder = dividend % divisor ; return gcd(divisor,remainder) ; } else return dividend ; } // 以參考值傳遞引數,將x,y兩數對調 void swap(int &x, int &y) { int temp = x; x = y; y = temp; }
常見的遞迴應用 • 求最大公因數GCD
常見的遞迴應用 • 3 排列 • 將1、2、3三項資料做排列之可能情形如下:
常見的遞迴應用 • 4 河內之塔:將n個碟子從a柱搬移到c柱的遞迴式 void hanoi(int n,char a, char b, char c) { int step=0; if(n > 1) hanoi(n-1, a, c, b); cout << "步驟 <" << setw(2) << ++step << "> 從 " << a << " 柱搬 " << n<< " 號碟片到 " << c << " 柱\n"; if(n > 1) hanoi(n-1, b, a, c); }
常見的遞迴應用 • 5 二元樹的追蹤和應用(請參閱第6章6.5節) • 6 遊戲樹(請參閱第6章6.8.2節) • 7 快速排序法(請參閱第8章8.2.5節)
第五章習題 • 何為遞迴程序? • 撰寫遞迴演算法需考量哪些因素? • 以非遞迴方式求兩正整數之GCD演算法為何? • 求費氏數列之非遞迴演算法為何? • 試寫出LCM(x,y)的遞迴演算法? 程式作業: 以遞迴與非遞迴方式求兩正整數的LCM(x,y)。