個人覺得漢諾塔這個遞歸算法比電子老鼠的難了一些,不過一旦了解了也還是可以的,其實網上也有很多代碼,可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時代碼寫得很長很長,也是不了解遞歸的結果。現在想起來漢諾塔的算法就3個步驟:第一,把a上的n-1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第三,因為n-1個盤全在b上了,是以把b當做a重複以上步驟就好了。是以算法看起來就簡單多了。不過,思考過程還是很痛苦的,難以了解。遞歸中會儲存資料的好處在這裡又得到展現,太神奇了。
漢諾塔代碼如下:
#include<stdio.h> void move( int n, char a, char b, char c) { if (n==1) printf ( "\t%c->%c\n" ,a,c); //當n隻有1個的時候直接從a移動到c else { move(n-1,a,c,b); //第n-1個要從a通過c移動到b printf ( "\t%c->%c\n" ,a,c); move(n-1,b,a,c); //n-1個移動過來之後b變開始盤,b通過a移動到c,這邊很難了解 } } main() { int n; printf ( "請輸入要移動的塊數:" ); scanf ( "%d" ,&n); move(n, 'a' , 'b' , 'c' ); } |