[問題] 河內塔的問題!!

看板C_and_CPP (C/C++)作者 (昌ㄟ喔)時間15年前 (2010/11/05 11:43), 編輯推噓2(2011)
留言13則, 5人參與, 最新討論串1/2 (看更多)
以下我是參考書籍的程式~網路上大部份也是這個程式 問題我看不懂!!希望高手幫個忙~謝謝 void hanoi(int,int,int,int); int main(void) { int i; printf("總共有多少圓盤要搬\n"); scanf("%d",&i); hanoi(i,1,2,3); system("pause"); return 0; } void hanoi(int i,int begin,int mid,int dest) { if (i==1) printf("將第 %d 個盤子從第 %d 個塔移到第 %d 個塔\n",i,begin,dest); else { hanoi(i-1,begin,dest,mid); printf("將第 %d 個盤子從第 %d 個塔移到第 %d 個塔\n",i,begin,dest); hanoi(i-1,mid,begin,dest); } 我最大的疑問在else之後! 假設盤子輸入3時就是i=3時 第一個動作進入hanoi(i-1,begin,dest,mid); 所以printf()出來為什麼會是第一個盤子從第一個塔移到第三個塔 因為是第一個i=3;為什麼第一個顯示會是1呢? 另一個問題為什麼不可以把第二行printf()放在第一個hanoi之前呢? 另外有一個最大的問題! 我看不出來hanoi是在甚麼時候運算的! 懇請高手幫幫忙...非常感謝!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.240.172.103

11/05 11:45, , 1F
先請問你:你知道什麼是遞迴嗎?
11/05 11:45, 1F

11/05 11:49, , 2F
我的觀念是函式中再呼叫自己出來!
11/05 11:49, 2F

11/05 11:59, , 3F
拿筆跟紙照程式嗎畫一次就知道了吧,人腦也能當編譯器啊
11/05 11:59, 3F

11/05 11:59, , 4F
把數字代進去, 還有要自己玩玩看...
11/05 11:59, 4F

11/05 12:01, , 5F
如果是三個盤子, 從柱1移到柱3 → hanoi(3,1,2,3);
11/05 12:01, 5F

11/05 12:01, , 6F
遞迴是 5! = 5 * 4!; 又 4! = 4 * 3! 第n項結果是依賴於前
11/05 12:01, 6F

11/05 12:01, , 7F
面n-1項的結果。
11/05 12:01, 7F

11/05 12:02, , 8F
然後又遞迴呼叫了 hanoi(2,1,3,2); 再移最大的盤子
11/05 12:02, 8F

11/05 12:03, , 9F
再呼叫 hanoi(2,2,1,3); 把兩個盤子放到最大盤子上面
11/05 12:03, 9F

11/05 12:05, , 10F
你的 printf 實際上也是一個動作, 並不是印出東西而已
11/05 12:05, 10F

11/05 12:06, , 11F
所以次序很重要, 如果現在 3 個柱子都是 stack, 那這
11/05 12:06, 11F

11/05 12:06, , 12F
亂移整個都會錯掉
11/05 12:06, 12F

11/05 13:26, , 13F
謝謝
11/05 13:26, 13F
文章代碼(AID): #1Cqtrv7B (C_and_CPP)
文章代碼(AID): #1Cqtrv7B (C_and_CPP)