亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請幫我解釋下這個函數是怎么求出步驟的,謝謝

請幫我解釋下這個函數是怎么求出步驟的,謝謝

C PHP
陪伴而非守候 2022-09-02 14:10:12
問題是這樣的:有三根針ABC,A針上有n個盤子,大小不等,大的在下小的在上.要求把這n個盤子從A針移到C針,可以借助B針,每次只能移動1個盤子,且在移動過程中3根針上都要保證大盤在下小盤在上.具體的調用函數是:void move (getone,putone)char getone ,putone;{printf("%c----%c\n",getone,put);}void hanoi (n,one,two,three)char one,two,three;int n;{if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}主函數沒什么實際用途就是把步驟輸出,我就不打了我是個初學者,剛剛看到遞歸調用這里,有些不懂
查看完整描述

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個塔"看作一步完成的,至于這步是怎么完成的,會由計算機逐級遞歸展開函數棧具體實現,我們不必多想.因為每一級的過程都是一樣的,所以用遞歸,減少代碼規模

遞歸的思想相對較容易,即只看見本層次,低層次由于過程和本層完全相同,調用遞歸函數自身,來重復利用代碼.由于會函數嵌套調用會有多余的時間空間耗費,所以在遞歸次數過大等情況下,盡量用非遞歸的方法實現.


查看完整回答
反對 回復 2022-09-06
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

AutoFlowchart 是一個極佳的根據源程序生成流程圖的工具,主要用于對已有的程序進行分析,并為制作項目文檔做準備。它生成的流程圖支持展開/合攏,縮放和移動也很方便,并且可以預設流程圖的長寬和縱向橫向間距。你可以將流程圖導出到WORD文檔或Bmp圖像文件。
它是軟件AgFlowchart的換代產品,它修正了一些AgFlowchart的bug,并且增加了許多新的功能。
它支持C,C++,VC++(Visual C++ .NET),Delphi(Object Pascal).

根據源程序生成流程圖
導出流程圖到WORD文檔中
展開/合攏流程圖
自動生成一個 TreeView顯示所有函數/過程
同步顯示對應塊的源程序和流程圖
自定義流程圖的配色方案
自定義流程圖的大小和間距
根據格式自動排列程序
自由縮小、放大、移動流程圖
顯示程序行號
支持清除當前流程圖
導出流程圖到*.bmp文件



查看完整回答
反對 回復 2022-09-06
?
森欄

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。


查看完整回答
反對 回復 2022-09-06
  • 3 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號