漢諾塔問題,漢諾塔問題公式是什麼?

2022-01-03 11:07:00 字數 5747 閱讀 8950

1樓:應雅牧雲亭

漢諾塔問題的c++實現

#include

using

namespace

std;

char

a,b,c;

intmain()

void

print(char

a,char

c){cout<%d\n",a,c);的含義。

以上就是漢諾塔問題的數學模型,比較抽象。

就以hanoi(4,1,2,3)舉例來說:1、2、3分別代表可以存放盤子的底座的編號,4表示剛開始時第1個底座有4個盤子,a、b、c分別代表:問題開始時的原來存放盤子的底座、臨時底座、問題結束時盤子存放的底座。

那麼怎麼將第1個底座上4個盤子移動到第3個底座上呢?

按照上面的模型,分成三步:

(1)將第1個底座的最上面的3個盤子移動到第2個底座上;

(2)將第1個底座上剩下的1個盤子直接放到第3個底座上;

(3)將第2個底座上的3個盤子移動到第三個底座上;

上面三個過程實際上就對應到你的hanoi(...)函式的中的三個語句。

第(1)、(3)步就是相當於原來問題的兩個變形。可以把第(1)步理解為:將n-1個盤子從第1個底座搬到第2個底座的漢諾塔問題,這樣問題有3個變化的地方和1個不變的地方:

盤子總數減少了1、要將盤子移動到的目標底座變成了第2個底座了、臨時底座變成了第3個底座了、問題的本質上還是漢諾塔問題,這個不變很重要,它是問題可以遞迴求解的關鍵,也就是說可以用不同的引數來呼叫同一個函式來解決。對應到hanoi(...)函式的4個引數中的3個變化。

完成了前面兩步後,顯然問題並沒有解決,所以才有第(3)步,也就是第二個遞迴。同樣的道理第(3)步可以理解為:將n-1個盤子從第2個底座搬到第三個底座的漢諾塔問題了。

只不過與第一個遞迴不同的是:原來的第2個底座相當於原來的第1個底座、原來的第1個底座相當於現在的第2個底座了。

補充:對於初學者來說,求解漢諾塔問題的方法其實很簡單,但是求解的細節卻很繞人,1、2、3與a、b、c的關係就不太好理解。個人認為搞清楚形式引數與實際引數的關係會對理解程式**有幫助。

直觀的來看,123就是實際引數,abc就是形式引數。由前面內容可以看出,其實123和abc的意義在每一層遞迴呼叫中的含義是不同的,但就hanoi(int

n,int

a,int

b,int

c)而言,每次呼叫它都是把當前要移動的盤子總數傳給n、盤子初始位置傳給a、目標位置傳給c。進入hanoi函式內部以後,問題被分解為「三步走」這樣abc的具體含義在遞迴呼叫時就變化了。

2樓:匿名使用者

數學歸納法:

一個盤子的話,一次就ok,記a1=1

兩個盤子,分三步:

1.將b最上面的一個盤子移到c上,就個就是上面一個盤子的情況,即a1次

2.將b最下面的盤子移到a上,一次就好。

3.將c的所有盤子(1個),移到a上面,即a1次。

也就是a2=2a1+1=3 =2^2-1

三個盤子,分三步:

1.將b最上面的兩個盤子移到c上,即a2次2.將b最下面的盤子移到a上,一次就好。

3.將c上面的兩個盤子,移到a上,即a2次。

也就是a3=2a2+1=7=2^3-1

同理,n個盤子的情況:

1.將b上面的n-1個盤子移到c上,即an-1次2.將b最下面的盤子,移到a上,一次就好

3.將c上面的兩個盤子,移到a上,即an-1次也就是an=2an-1 +1=2^n-1

漢諾塔問題公式是什麼?

3樓:匿名使用者

漢諾塔問題的非遞迴非堆疊演算法(一)

#i nclude

#i nclude

#define maxno 10000

int step_d,step_s,no;//定義將要行進的步數void main()

//初始化完畢

if(fmod(no,2))else //判斷奇數盤的步數和偶數盤的步數

int from,to;

from=0;

to=step_s+from;

p[0]=&p[0][no];

while(*(p[0]) != *(p[1]))漢諾塔問題的非遞迴非堆疊演算法(二)

前一種方法的/*原理:

如果把三個柱子圍成一個環,盤子總數為n,其移動的規律是:

如果n為偶數:奇數號盤每次2步;偶數號盤每次1步;

如果n為奇數:奇數號盤每次1步;偶數號盤每次2步;

至於下一步該移動哪個柱子上的盤子,通過大小和順序即可判斷。

以上可以通過數學證明,不贅述!

4樓:匿名使用者

這是一個古典的數學問題,是一個用遞迴方法解題的典型例子.

問題是這樣的:古代有一個梵塔,塔內有3個座a,b,c,開始時a座上有n個盤子,盤子大小不等,大的在下,小的在上.有一個老和尚想把這n個盤子從a座移到c座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持**在下,小盤在上.

在移動過程中可以利用b座.

將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個步驟分成兩類操作:

1.將n-1個盤從一個座移到另一個座上(n>1).

2.將1個盤子從一個座上移到另一個座上.

下面是用c語言實現的**:

用hanoi函式實現上面第1類操作,用move函式實現上面第2類操作,函式呼叫hanoi(n,one,two,three)表示將n個盤子從"one"座移到"three"座的過程(藉助"two"座).函式呼叫move(x,y)表示將1個盤子從x座移到y座的過程.x和y是代表a,b,c座之一,根據每次不同情況分別取a,b,c代入.

程式:void move(char x,char y)

void hanoi(int n,char one,char two,char three)

/*將n個盤從one座藉助two座,移到three座*/

}main()

另外補充說一句:移動n個盤子要經歷2∧n-1步.如移4個盤子經歷15步

5樓:連頭都想減的大頭

有三根杆子a,b,c。a杆上有n個(n>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至c杆:

1. 每次只能移動一個圓盤;

2. **不能疊在小盤上面。

我只知道這些

6樓:匿名使用者

a、b、c 3根針,a針自下而上由大到小套了n個環,目標是將所有環藉助b或c移動到c或b,移動規則:一次一個環;大不壓小。

漢諾塔演算法

#include

void hanoi(int n, char x, char y, char z)

else

}void main()

{int n;

printf("input the height of the tower ...... \n");

scanf("%d",&n);

hanoi(n,'a','b','c');

7樓:tang屍三擺手

parcel::::::::::

program hanoi;

functionhanoi(x:integer):longint;

begin

if x=1 then hanoi:=1;

if x=2 then hanoi:=3;

else

begin

hanoi:=2*hanoi(x-1)+1;

end;

end;

begin

read(x)

write(hanoi(x));

end.

思想就是:第n個就等於第n-1個乘以2+1次

c++雙層漢諾塔問題。。。很有意思也很難

8樓:

其實和單層的一樣,將設有2n個在a

起始:a,需要移動2n,則先將2n-1個移到c,再將一個移到b,這時最大的兩個分別已經到位

起始:c,需要移動2n-2,則先將2n-4個移到a,再將一個移到b,這時次大的兩個分別到位

起始:a,需要移動2n-4,則先將2n-5個移到a,再將一個移到b,這時第三大的兩個分別到位

...以此類推就行,具體請去參考理解單層漢諾塔的實現

c++漢諾塔問題。

9樓: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個的情況。

c語言漢諾塔中的引數值變化不明白

設a上有n個盤子。如果n 1,則將圓盤從a直接移動到c。如果n 2,則 1.將a上的n 1 等於1 個圓盤移到b上 2.再將a上的一個圓盤移到c上 3.最後將b上的n 1 等於1 個圓盤移到c上。如果n 3,則 a.將a上的n 1 等於2,令其為n 個圓盤移到b 藉助於c 步驟如下 1 將a上的n ...

請問您去塔塔面試什麼情況,問了些什麼問題呢?謝謝

他給我打 叫我去參加面試,我沒有報他們家,我想幹的是出納,叫我去了面試的是 應收應付會計 一直在用英文問各種問題,我回答不算流利吧但是基本都答上來了,但是當我問他們為什麼出納工作崗位要這麼高的英文水平呢?他們回答我說要做培訓,要接什麼 而且要全英文能流利對話,然後我心想我只有四級水平那你叫我來幹什麼...

工作效率問題公式是什麼,三個工作效率公式是什麼

工作總量 工作效率 工作時間 工作效率 工作總量 工作時間 工作時間 工作總量 工作效率 工作效率 工作總量 工作時間 工作郊率x工作時間 工作總量 一 工作效率定義 工作效率,一般指工作產出與投入之比,通俗地講就是在進行某任務時,取得的成績與所用時間 精力 金錢等的比值。產出大於投入,就是正效率 ...