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

2022-01-28 16:28:25 字數 4236 閱讀 4254

1樓:新兵蛋子

,設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`-1(等於1)個圓盤移到c上。

(2)將a上的一個圓盤移到b。

(3)將c上的n`-1(等於1)個圓盤移到b。

b. 將a上的一個圓盤移到c。

c. 將b上的n-1(等於2,令其為n`)個圓盤移到c(藉助a),步驟如下:

(1)將b上的n`-1(等於1)個圓盤移到a。

(2)將b上的一個盤子移到c。

(3)將a上的n`-1(等於1)個圓盤移到c。

到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當n大於等於2時,移動的過程可分解為三個步驟:

第一步 把a上的n-1個圓盤移到b上;

第二步 把a上的一個圓盤移到c上;

第三步 把b上的n-1個圓盤移到c上;其中第一步和第三步是類同的。

當n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從一個針移到另一個針上,這裡的n`=n-1。 顯然這是一個遞迴過程,據此演算法可程式設計如下:

move(int n,int x,int y,int z)}main()

2樓:

漢諾塔問題主要是通過三個位置引數的不斷交換而完成的

即 one two three 三個引數實際值:'a','b','c'的不斷交換。

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

3樓:匿名使用者

在進行子程式呼叫時系統是先求出各引數的值,然後為這些數值分配新的空間(從技術上講是通過堆疊來實現),然後進入子程式。也就是說,從子程式的角度去看,每個型參都是自己專用的,與上級程式的對應變數完全割斷了聯絡。對於你的例子,在第一次進入子程式時one='a',two='b',three='c',

可是當執行hanoi( n - 1, one , three, two )這一句時,系統先求出:

第一引數=2

第二引數='a'

第三引數='c'

第四引數='b'

然後再次進入同一子程式(遞迴呼叫),進入後各型參已經與原來的沒有關係,即完全是新變數,它們的值按照上級傳來的引數位置進行初始化,成為:

n=2one='a'

two='c'

three='b'

明白了嗎?

4樓:

你是沒搞明白引數的意義

c語言漢諾塔中的"引數值"傳遞不明白

5樓:篤俠

one two three 只是形參名,move(one,three)表示用hanoi( n - 1, one , three, two )函式的第二個引數(one)和第三個引數(three)的值來呼叫move,至於one和three值是什麼,取決於呼叫hanoi函式的實參,怎麼會總是a-->c呢。比如,呼叫語句為:

hanoi(2,a,b,c);

則,進入hanoi函式時,one two three 的值分別為a b c,這時n == 1不成立,執行:

hanoi( n - 1, one , three, two ); // 這個呼叫語句相當於hanoi(2-1,a,c,b);

move( one, three ); //這個呼叫語句相當於move(a,c);

hanoi( n - 1, two, one, three ); // 這個呼叫語句相當於hanoi(2-1,b,a,c);

——不知明白了沒有。

6樓:匿名使用者

可以參考遞迴的問題!

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

7樓:匿名使用者

你要倒著想這個問題的順序。要解決漢諾塔問題,就要從地基開始考慮。電腦解決的思路是假設最後一步是這樣的:

最小的一片在a柱子上,其他的片排好了在c柱子上。那麼這時,問題就可以變成把最小的一片挪到c柱子就完結了。那麼往前反推,怎樣能造成最後一步這樣的場景?

我們這裡假設有n片需要移到c柱子上去。如果能把最大的一片按規則移到c柱子,那一片就變成了我們不用考慮的地基,以後任何的移動都與他無關,然後再考慮剩下的n-1片,那麼問題的規模就會逐步縮小,逐漸縮小到電腦假設的最後一步。那麼什麼情況下當前最大的一片可以移到c上呢?

就是當其他比他小的n-1片都在b上了,他才能順利移到c上。這就是電腦解漢諾塔的基本思路,類似於逆推法。如果你理解了電腦解答這個問題的基本思路,就能理解這個演算法了。

回到你的具體問題。n=3。有3片需要移動,從小到大編號為1、2、3,柱子分別為one(a),two(b),three(c),則步驟如下:

1. 為了使3號片順利到c,那麼前提是1、2號片順利到b。

2. 1、2號到b,前提是2順利到b

3. 2順利到b,前提是1到c

4. 1可以成功到c,此時逆推過程,得解答

8樓:匿名使用者

呵呵,你在做漢諾塔的搬 動問題吧,這裡有一個詳細的**,你可以對比一下就可以出來了。

/*5. 源程式*/

/********hanoi.c*********/

#include

struct h

num[3];/*三個塔*/

void move(char x,char y,struct h num[3]);/*移動的具體過程*/

void hanoi(char x,char y,char z,int n,struct h num[3]);/*遞迴*/

void init(void);/*初始化*/

void close(void);/*圖形關閉*/

int computer=1;/*自動控制與手動控制的標誌*/

int speed=0;/*全域性變數speed主要是演示過程的速度*/

void main(void)

void init(void)/*初始化*/

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

for(i=0;i<3;i++)

num[i].top=-1;/*三個地方的高度開始都為-1*/

for(i=0;i");

outtextxy(310,30,num2);

settextstyle(0,0,2);

setfillstyle(solid_fill,black);/*把原來的地方移去塗黑*/

bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),

400-20*num[x-97].top-8,100+150*(x-97)+(33-3*

num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);

num[y-97].top++;/*入棧,目標點的top加1*/

num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目標點盤子的代號與源點盤子的代號相同*/

num[x-97].top--;/*出棧,原來地方的top減1*/

setfillstyle(solid_fill,num[y-97].data[num[y-97].top]+1);/*盤子顏色**是棧頂盤子代號加1*/

bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),

400-20*num[y-97].top-8,100+150*(y-97)+

(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);

if(computer)/*自動控制就用delay*/

delay(speed);/*延時函式*/

else

getch();/*手動控制的話就自己按鍵盤來控制*/

}void hanoi(char one,char two,char three,int n,struct h num[3])/*遞迴n為盤子數,num為堆疊*/

}void close(void)/*圖形關閉*/

c語言fopen函式中檔案開啟方式引數值

c語言fopen函式用於開啟檔案。函式原型 file fopen const char path,const char mode 引數 path 字串型別,表示檔案所在的路徑,包括檔名 mode 開啟檔案的模式 返回值 檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回null,並...

怎樣定義C語言函式中的引數 實參 形參

int fun int x,int y x,y就是 du形zhi 參dao main include void add int x,int y 定義函式時候,函自數的參bai數就是形參,void main c語言中什麼是形參,什麼是實參?形參 全稱為 形式引數 是在定義函式名和函式體的時候使用的引數...

C語言函式呼叫引數傳遞的是什麼,在C語言裡向函式傳遞的是「引數」是什麼意思

c語言傳遞的是值而不是地址,這一點從vb轉過來的程式設計師一定要注意。否則不經版 意間就會犯權錯誤。另外下層函式修改上層函式變數不是一種好習慣,容易引發錯誤。c語言中函式可以返回一個函式值,如果你需要返回多個函式值可以用下面的形式 fun int a,int b main 如果按vb的習慣,fun ...