3 回答

TA貢獻1796條經驗 獲得超10個贊
首先我來解釋一下漢諾塔的原理:
當搬運的碟子數n=1時,直接搬運即可;當n>1時,要把n個碟子從針1搬運到針3,則必須通過針2(即需要一個獨立于源針和目的針的中間針,用來輔助);假設我們已經成功的把上面較小的n-1個碟子搬運到了針2,那么我們只需要再把第n個碟子(底層最大的那個)搬運到針3,再把針2的n-1個碟子搬運到針3,那么這n個碟子塔就成功的搬運到了針3了.而整個n-1的塔要怎么搬運呢?這就是遞歸啦
所以整個步驟:
1.搬運n-1個碟子到中間針(遞歸)
2.搬運第n個碟子到目的針
3.搬運中間針的n-1個碟子到目的針(遞歸)
void move (getone,putone)
函數的作用是用于搬運最底層的第n個碟子,從getone針搬到putone針
void hanoi (n,one,two,three)
函數的作用是,把n層塔從one針(源)搬運到three針(目的),用two針來輔助(中間)
所以上面的步驟就可以翻譯成c語言了
要想把n個碟子從one針搬運到three針的三個步驟:
(與第一段陳述的三個步驟對應,即hanoi(n,one,two,three)函數要完成的功能,函數主體)
1.hanoi(n-1,one,three,two);是遞歸調用,如果n-1>1則它又會去執行3個步驟,以至于無窮
2.move(one,three);這一步是具體移動,所以要輸出移動方法,讓用戶能看見移動方向
3.hanoi(n-1,two,one,three);遞歸
遞歸調用只要有整體觀念就行了,你在寫代碼的過程中可以把"移動n-1個塔"看作一步完成的,至于這步是怎么完成的,會由計算機逐級遞歸展開函數棧具體實現,我們不必多想.因為每一級的過程都是一樣的,所以用遞歸,減少代碼規模
遞歸的思想相對較容易,即只看見本層次,低層次由于過程和本層完全相同,調用遞歸函數自身,來重復利用代碼.由于會函數嵌套調用會有多余的時間空間耗費,所以在遞歸次數過大等情況下,盡量用非遞歸的方法實現.

TA貢獻1797條經驗 獲得超6個贊
AutoFlowchart 是一個極佳的根據源程序生成流程圖的工具,主要用于對已有的程序進行分析,并為制作項目文檔做準備。它生成的流程圖支持展開/合攏,縮放和移動也很方便,并且可以預設流程圖的長寬和縱向橫向間距。你可以將流程圖導出到WORD文檔或Bmp圖像文件。
它是軟件AgFlowchart的換代產品,它修正了一些AgFlowchart的bug,并且增加了許多新的功能。
它支持C,C++,VC++(Visual C++ .NET),Delphi(Object Pascal).
根據源程序生成流程圖
導出流程圖到WORD文檔中
展開/合攏流程圖
自動生成一個 TreeView顯示所有函數/過程
同步顯示對應塊的源程序和流程圖
自定義流程圖的配色方案
自定義流程圖的大小和間距
根據格式自動排列程序
自由縮小、放大、移動流程圖
顯示程序行號
支持清除當前流程圖
導出流程圖到*.bmp文件

TA貢獻1810條經驗 獲得超5個贊
為了便于理解,先分析將A座上的3個盤子移到C座上的過程:
(1) 將A座上2個盤子移到B座上(借助C);
(2) 將A座上的1個盤子移到C座上;
(3) 將B座上的2個盤子移到C座上(借助A);
其中第(2)步可以直接實現。第(1)步可以用遞歸方法分解為:
1、將A上一個盤子從A移到C;
2、將A上1個盤子從A移到B;
3、將C上1個盤子從C移到B;
第(3)步可以分解為:
3.1將B上一個盤子從B移到A上;
3.2將B上一個盤子從B移到C上;
3.3將A上一個盤子從A移到C上;
將以上綜合起來,可得到移到3個盤子的步驟為:
A→C,A→B,C→B,A→C,B→A,B→C,A→C.
由上面的分析可知:將n個盤子從A座一定哦C座可以分解以下3個步驟:
(1)將A上n-1個盤借助C移到B座上;
(2)把A座上剩下的一個盤移到C座上
(3)將n-1個盤從B座借助A座移到C座上。
上面第(1)步和第(3)步,都是把n-1個盤從一個座移到另一個座上,采取的辦法是一樣的,只是座名不同而已。為使之簡化,可以將第(1)步和第(3)步表示為:
將“one”座上的n-1個盤移到“two”座(借助“three”座),只是在第(1)步和第(3)步中,one two three和A B C對應關系不一樣。對第(1)步one 對應A,two對應B,three對應C。第(3)步是:one 對B,two 對應C,three對應A。
- 3 回答
- 0 關注
- 150 瀏覽
添加回答
舉報