{if (n==1) printf("%c-->%c\n",a,c);
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
}
我給妳詳細解釋下這個程序中的代碼吧。我也是剛學,希望對妳有用。可能有些不好之處,還希望諒解。
先說下這個問題的整體思想:
1,如果只有1個盤,那麽就直接把這個盤從A移動到C上。
2,如果存在兩個盤,那麽先把第壹個盤移動到B上,在把最下面壹個盤移動到C上,在把B上的盤移動到C上。
3,這樣,我們可以得出壹個結論,如果存在N個盤,可以先把上面N-1個盤通過C 移動到B上,然後把第N個盤移動到C上, 再把B上的N個盤通過A移動到C上。
if (n==1) printf("%c-->%c\n",a,c);
這壹句,表示只有1個盤子的時候,那麽就是把第壹個盤子直接移到第三個盤子上。
else {hanoi (n-1,a,c,b);
如果超過壹個盤字,則需要先把N-1個盤子通過C 移動到B上。
printf ("%c-->%c\n",a,c);
把剩下的第N個盤,從A移動到C上。
hanoi (n-1,b,a,c);}
再把剩下的在B上的N-1個盤,通過A移動到C上。
這屬於壹個遞歸算法。
現在,N=3。
我們看下程序怎麽運行的。
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
N=3,也就是開始程序會執行
hanoi (2,a,c,b);這句語句。
再看,2還是大於1,所以
程序會繼續運行。 註意,這裏,為hanoi (2,a,c,b); C和B 換了位置。
hanoi (2,a,c,b);
我們把數字代入,得出。
根據 N=2,C和B 互換。以及下面的代碼,得出
````````````````````````````````````````````````
hanoi(n,a,b,c)
int n;
char a,b,c;
{if (n==1) printf("%c-->%c\n",a,c);
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
}
```````````````````````````````````````````````
hanoi(2,a,c,b)
int n=2;
char a,c,b;
{if (n==1) printf("%c-->%c\n",a,b);
else {hanoi (1,a,b,c);
printf ("%c-->%c\n",a,b);
hanoi (1,c,a,b);}
} / 這並不是正確的代碼,只是為了得出答案而寫的壹些數據。/
這樣, 我們可以看出,程序會先執行
else {hanoi (1,a,b,c);
所以,開始會先輸出A C(中間的符號省略,以下也壹樣)
然後,再輸出
printf ("%c-->%c\n",a,b); A B
接著,執行
hanoi (1,c,a,b);} 這時候,就是C B了。
也就是說 hanoi(2,a,c,b) 的輸出為 AC AB CB
妳的問題就已經解決了。
接下來再返回第壹層:
現在,N=3。
我們看下程序怎麽運行的。
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
這時候,我們再把數字代進去。
現在,N=3。
我們看下程序怎麽運行的。
else {hanoi (2,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (2,b,a,c);}
根據上面的結論
/ 也就是說 hanoi(2,a,c,b) 的輸出為 AC AB CB /
可以看出,先執行第壹條語句:
else {hanoi (2,a,c,b);
則輸出 AC AB CB
再執行第二條語句:
printf ("%c-->%c\n",a,c);
輸出 AC
然後執行第三條
hanoi (2,b,a,c);}
根據這裏,/ 也就是說 hanoi(2,a,c,b) 的輸出為 AC AB CB /
字母進行替代後,A變B,C變A B變C。
所以輸出的AC AB CB 則為
BA BC AC
所以,最終的結果為 AC AB CB AC BA BC AC
中間可能有很多廢話,可以不看。
這樣算下去,不管多少層都能推算出來,可復雜度會高得難以想像。