Re: [問題] 河內塔問題?
※ 引述《zadpos (人生啊)》之銘言:
: void hanoi(int n, char A, char B, char C) {
: if(n == 1) {
n==1 想當然爾 就是將盤子由 A柱移動到C柱
所以在這裡要印出 Move sheet A to C
: printf("Move sheet %d from %c to %c\n", n, A, C);
: }
: else {
從else 開始就是當 n>=2的時候開始 為了簡單我們只需考慮n=2的情況
: hanoi(n-1, A, C, B);
在n=2的時候 演算法第一步驟到的就是 將最上面的一片碟子由A移動到B
這時候你的疑問是為什麼知道這裡要寫 A C B 這種順序吧 ??
這時候你要先想 我們在剛剛宣告n==1時的狀況 由A柱移動到C柱
hanoi( 1,A ,B, C ) 所以在A位置填入A C位置填入C 印出是 A 到 C 柱
那麼現在我們已經知道n是2 在減1 之後變成1了 這樣就回到最原本n==1的狀況
我們呼叫hanoi要印出 A 到 B柱 要怎麼印
那當然就是要把A位置填入A C位置填入B 所以是 hanoi(2-1, A ,--,B )
這樣就可以印出 A移動到B
--->所以這樣就很好記了 用有兩個碟子的情況去想 不要去想n>2以上的遞回
所以這時候 兩片盤子的最上面的那片已經 由A 移動到 B了 程式這個函式也剛好結束
那這時候你會說 那 A C B的C呢?? 為什麼要在原本B的位置放入C ???
因為要保存 C的值 如果不填入C 還是維持原本的B 到下一次要用C值的時候
C值會不見
: printf("Move sheet %d from %c to %c\n", n, A, C);
接著演算法第二步驟 將A柱最下面的碟子(剩下的一片) 印出由A移動到 C
: hanoi(n-1, B, A, C); }
演算法第三步 將 位於B柱上的碟片 移動到 C柱
這時候跟第一步驟一樣 我們想要印出 B 移動到 C
所以原本hanoi(n,A,B,C) 我們要把A位置取填入B 變成(2-1,B, -- ,C) 這樣就會印出B移動到C
我想這樣大致上應該會比較容易了解吧
那你最後可能會問 那原本的A,B,C的B為什麼要填入A勒???
因為要保存數值!!如果還是用原本的B 那A的值會不見 所以要把A的值放到B的位置
: }
: int main() {
: int n;
: printf("請輸入盤數:");
: scanf("%d", &n);
: hanoi(n, 'A', 'B', 'C');
: system("pause");
: return 0;
: }
: 我的問題是這行
: hanoi(n-1, A, C, B);
: 我想問一下A C B變數是怎麼代入hanoi??
: 我搞不懂n=3 第一步是 Move sheet 1 from A to C
: 但n=2 卻是 Move sheet 1 from A to B
: 謝謝~~
--
最深的祝福是沒有期限的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.232.243.233
※ 編輯: reon 來自: 118.232.243.233 (09/26 13:21)
推
09/26 20:10, , 1F
09/26 20:10, 1F
→
09/26 20:11, , 2F
09/26 20:11, 2F
→
09/26 20:11, , 3F
09/26 20:11, 3F
→
09/26 20:11, , 4F
09/26 20:11, 4F
推
09/27 21:46, , 5F
09/27 21:46, 5F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章