Re: [問題] 河內塔問題?

看板C_and_CPP (C/C++)作者 (完成這條天堂路)時間16年前 (2009/09/26 12:52), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串1/1
※ 引述《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
你可以解釋成「將n個盤子由A柱經由B柱搬往C柱」
09/26 20:11, 2F

09/26 20:11, , 3F
這樣中間那個 B 就有個實際上的意義了
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
文章代碼(AID): #1AlPuZaW (C_and_CPP)
文章代碼(AID): #1AlPuZaW (C_and_CPP)