c語言漢諾塔問題如下:#include <stdio.h>char move (char x, char y);char hanoi(int n,char a, char b, char c);int main(){int n;char a,b,c;a='A';b='B';c='C';scanf("%d",&n);hanoi (n,a,b,c);}char hanoi(int n,char a,char b, char c){if (n==1){ move(a,c); }else { hanoi(n-1,a,c,b);move(a,c);hanoi(n-1,b,a,c);}return;}char move(char x,char y){ printf("%c->%c\n",x,y);}
2 回答

慕娘9325324
TA貢獻1783條經驗 獲得超4個贊
兩個盤子,1表示小的,2表示大的。
(第一層)調用hanoi(2,a,b,c), n==1 不滿足,執行else子句(進入第二層的調用),
(第二層)調用hanoi(1,a,c,b),此時滿足n==1, 執行move(a,c),(因為此時的c為上次調用傳進來的b)即將a柱子上1號盤子移動到b柱子上,返回,
(第二層)執行move( a, c),即將a柱子上2號盤子移動到c柱子上,
(第二層)調用hanoi(1,b,a,c),進入函數后滿足n==1執行move(a,c),(此時的a為上次傳進來的B),所以將b柱子上的1號盤子移動到c柱子上。
只要看清楚對應關系就能搞清楚

叮當貓咪
TA貢獻1776條經驗 獲得超12個贊
漢諾塔問題是一個遞歸的經典例子,基本上不用遞歸不知道如何編程實現。
問題就是從樁子1移到樁子3,借助樁子2.移動N個盤子共移動多少次。
此問題遞歸解法的解釋就是:
先從1移到2,借助3,移動N-1個盤子。此時1上還有一個盤子。即 hanoi(n - 1, one, three, two);
可以直接將一個盤子移到3 move(one, three);
然后將剩余的在2上的N-1個盤子移到3上,借助1 hanoi(n - 1, two, one, three);
這里的1、2、3對應你上面的代碼就是ABC
添加回答
舉報
0/150
提交
取消