1樓:聽雨晨安
首先不看**,理一下思路,漢諾塔解題步驟有三步(設a->c),先將漢諾塔看成兩部分n-1,1(n-1在上面)
第一:將a中的n-1個盤藉助c移到b ===>hanoi(n-1,a,c,b);
第二:將a中的最下面的那一個移到c===>move(a,c);
第三:將b中的盤藉助a移到c.===>hanoi(n-1,b,a,c);
就是這樣,因為這是一個遞迴呼叫的過程,具體的細節比較複雜,但思路就是這樣。
2樓:匿名使用者
#include
using namespace std;
void hanoi(int, char, char, char);
void move(char, char);
int main()
void hanoi(int n,char a,char b,char c)
}void move(char sour,char dest)主要思想是:不管有幾個盤子,將一個和其他的看成兩部分,然後按照同樣的方法移動即可;首先應寧明白二個三個似的的情況,發現規律
c++漢諾塔問題。
3樓:bsr弧度的微笑
哈哈 很簡單的:我說下遞迴的理解方法(拿你說的漢諾塔做例子),簡單的話給我加分哦 ~親
首先:對於遞迴這一類函式,你不要糾結於他是幹什麼的,只要知道他的一個模糊功能是什麼就行,等於把他想象成一個能實現某項功能的黑盒子,而不去管它的內部操作先,好,我們來看下漢諾塔是怎麼樣解決的。(借用一下樓下的** 呵呵)
首先按我上面說的把遞迴函式想象成某個功能的黑盒子,void hanoi(int n,char one,char two,char three); 這個遞迴函式的功能是:能將n個由小到大放置的小長方形從one 位置,經過two位置 移動到three位置。那麼你的主程式要解決的問題是要將m個的"漢諾塊"由a藉助b移動到c,根據我們上面說的漢諾塔的功能,我相信傻子也知道在主函式中寫道:
hanoi(m,a,b,c)就能實現將m個塊由a藉助b碼放到c,對吧?所以,看樓下的主程裡面有hanoi(m,'a','c','b');這個呼叫。
接下來我們看看要實現hannoi的這個功能,hannoi函式應該幹些什麼?
在hannoi函式裡有這麼三行
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
同樣以黑盒子的思想看待他,要想把n個塊由a經過b搬到c去,是不是可以分為上面三步呢?
這三部是:第一步將除了最後最長的那一塊以外的n-1塊由one位置經由three搬到two 也就是從a由c搬到b 然後把最下面最長那一塊用move函式把他從a直接搬到c 完事後 第三步再次將剛剛的n-1塊藉助hannoi函式的功能從b由a搬回到c 這樣的三步實習了n塊由a經過b到c這樣一個功能,同樣你不用糾結於hanoi函式到底如何實現這個功能的,只要知道他有這麼一個神奇的功能就行
最後:遞迴都有收尾的時候對吧,收尾就是當只有一塊的時候漢諾塔怎麼個玩法呢?很簡單吧,直接把那一塊有amove到c我們就完成了,所以hanoni這個函式最後還要加上 if(n==1)move(one,three);(當只有一塊時,直接有amove到c位置就行)這麼一個條件就能實現hanoin函式n>=1時將n個塊由a經由b搬到c的完整功能了。
遞迴這個複雜的思想就是這樣簡單解決的,呵呵 不知道你看懂沒?純手打,希望能幫你理解遞迴
總結起來就是不要管遞迴的具體實現細節步驟,只要知道他的功能是什麼,然後利用他自己的功能通過呼叫他自己去解決自己的功能(好繞口啊,日)最後加上一個極限情況的條件即可,比如上面說的1個的情況。
4樓:九華閆女
遞迴解決,算是經典了,幾乎任何一本寫演算法的教材中都有!
c++之漢諾塔問題
5樓:匿名使用者
我沒研究過漢諾塔,但是c/c++有很多時候是可以用陣列來解決問題而避免使用指標的。
6樓:匿名使用者
漢諾塔是一個經典的遞迴問題
不需要用到指標的
遞迴思想就是 如果只有一個盤子
那麼 把盤子直接移到目的柱
有兩個盤子 把最上面一個移動到中間柱
把最下面的一個移動到目的柱 然後把中間的移動到目的柱當規模為n的時候也就是這樣的遞迴思想
把上面的n-1個移動到中間柱 把最後一個移動到目的柱然後再把n-1個移動到目的柱
我只把思想給你解釋一下
至於** 這麼經典的程式 網上多的是
去找找就有了
7樓:匿名使用者
#includeusing namespace std;int main() 沒有使用指標,符合你的要求,呵呵
8樓:匿名使用者
採用遞迴呼叫就行:#include
using namespace std;void move(char getone,char putone)
執行結果:
9樓:匿名使用者
#include
using namespace std;
void move(int n,char ch1,char ch2,char ch3)
}int main()用這個
10樓:次元說
漢諾塔問題怎麼解決,可以利用遞迴法來解決。設移動盤子數為n,為了將這n個盤子從a杆移動到c杆,可以以c盤為中介,從a杆將1至n-1號盤移至b杆。將a杆中剩下的第n號盤移至c杆。
以a杆為中介;從b杆將1至n-1號盤移至c杆。這樣漢諾塔問題就解決了
c語言漢諾塔的問題,C語言漢諾塔的問題
要看懂遞迴程式,往往應先從最簡單情況看起。先看hanoi 1,one,two,three 的情況。這時直接將one柱上的一個盤子搬到three柱上。注意,這裡one柱或three柱到底是a b還是c並不重要,要記住的是函式第二個引數代表的柱上的一個盤被搬到第四個引數代表的柱上。為方便,將這個動作記為...
C語言程式解釋
問題出現在x y z 因為這種賦值是從右向左的。所以y z,得到y 0 x y得到x 0 而x 0 這個表示式的值為0.所以if x y z 條件為假,執行不了x 3 所以結果是x 0,z 0 就是試卷上的答案是 0,0.有問題hi我 當然是0,0了,因為if語句不加大括號的話,隻影響緊接著它的一個...
c語言。金字塔,求解釋,C語言。金字塔 ,求解釋。
列印一行5顆星你會不?for i 1 i 5 i 迴圈列印5顆星列印下面這張圖你會不?5行5顆星 就是在上面的基礎上在來一個迴圈for j 1 j 5 j 外層迴圈for i 1 i 5 i 迴圈列印5顆星printf n 現在說你的圖 就是你給的那個,我不重複了。至於裡面的數量關係的規律,你可以從...