在西元 1883 年, 法國數學家 Lucas 所提出流傳在印度的河內塔 (Tower of Hanoil) 遊戲, 是典型使用遞迴與堆疊觀念來解決的範例. 河內塔問題描述如下 :
解題說明 :
為了方便推導公式, 我們將從移動一個盤子開始, 再來移動兩個. 最後考慮移動 n 個盤子.
* 移動一個盤子 :
* 移動兩個盤子 :
* 移動 n 個盤子 :
公式推導 :
由上面解題說明, 在解移動 n 個盤子時, 可以看成下面的組合 :
所以公式推導如下 :
範例程式 :
* ch04.h 代碼 :
- /*
- * 利用河內塔函數求出不同盤子數的盤子移動步驟.
- */
- void ch04_06(bool b);
- #include "ch04.h"
- #include
- using namespace std;
- void _hanoi(int n, int p1, int p2, int p3) {
- if(n==1) {
- cout << "移動盤子從 " << p1 << " 到 " << p3 << endl;
- } else {
- _hanoi(n-1, p1, p3, p2);
- cout << "移動盤子從 " << p1 << " 到 " << p3 << endl;
- _hanoi(n-1, p2, p1, p3);
- }
- }
- void ch04_06(bool b) {
- if(b) {
- int j;
- cout << "請輸入盤子數量: " ;
- cin >> j;
- _hanoi(j, 1, 2, 3);
- }
- }
執行函式 ch04_06 結果 :
補充說明 :
* [ 資料結構 小學堂 ] 堆疊 : 堆疊應用 (遞迴)
* [C++ 演算法] 河內塔 (Towers of Hanoi)
沒有留言:
張貼留言