當前位置:首頁 » 編程語言 » c語言先定義函數的漢諾塔
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言先定義函數的漢諾塔

發布時間: 2023-04-19 14:40:16

c語言編程(漢諾塔問題)

move(n-1,x,z,y);——這句是調用函數,這個函數就是前面聲明的:void move(int n,int x,int y,int z)
printf("%c-->%c",x,z);——這句是輸出,%c 是指按CHAR型輸出,"%c-->%c",就是輸出兩個CHAR型數據,中間用-->連接。而這兩個CHAR的數據就是x和z。比如結果是:a-->c
move(n-1,y,x,z);——這句還是調用函數,這個函數就是前面聲明的:void move(int n,int x,int y,int z)

㈡ C語言漢諾塔程序

將以下內容全部復制到新建的源文件中:(本人自己寫的,因為你那課本上的代碼,沒解釋,書寫不規范,很難理解清楚,所以我直接新寫了一個完整的代碼,附帶詳細說明)
#include <stdio.h>
//漢諾塔x層塔從A塔整體搬到C塔,中間臨時B塔。
//x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊
//藉助B塔可以將x層塔全部從A搬到C上,並且符合要求(在移動過程中大的那塊在下邊,小的那塊在上邊)
int main()
{
void tower(int x,char a,char b,char c); //聲明函數
int x=5,a='A',b='B',c='C'; //x表示有5層塔,具體要多少層自己修改這個值。abc分別表示ABC塔。

tower(x,a,b,c); //x層塔從a移動到c的全過程,主程序只有這條有效語句

return 0;
}

//以下是tower函數的定義
//參數解析:x層塔放在a上,b是中間塔,c是目標塔。即x層塔要從a搬到c上。
//此函數實現x層塔從a整體轉移到c上。以及這個過程是怎麼搬的全部過程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf("將%d從%c放到%c\n",x,a,c); //只有1層塔時,直接從a搬到c上。
else //不止1層塔,則先將x-1層塔從a按照規律搬到b上,再將最後一塊從a搬到c上,最後再將b上的x-1層塔按照規律搬到c上。
{
tower(x-1,a,c,b); //先將x-1層塔從a按照規律搬到b上,注意參數b放在最後,因為放在最後的參數是准備搬過去的目標塔。
printf("將%d從%c放到%c\n",x,a,c); //將最後一塊從a搬到c上
tower(x-1,b,a,c); //最後再將b上的x-1層塔按照規律搬到c上,注意參數b放在開頭,因為x-1層是要從b上搬過去的。
}
}

㈢ c語言 漢諾塔

因為if (n==1) printf("%c-->%c\n",a,c)這里少輸入了一個分號檔兆團,在後面加上;就可以行橘了

main()
{hanoi(3,'A','B','C');
}

hanoi(n,a,b,c)
int n;
char a,b,c;
{if (n==1) printf("%c-->%c\n"猜備,a,c);
else{hanoi(n-1,a,c,b);
printf("%c-->%c\n",a,c);
hanoi(n-1,b,a,c);}
}

㈣ 用c語言編寫程序求漢諾塔的移動步驟

#include<stdio.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void f(int n,char a,char b,char c)
{
if(n==1) move(a,c);
else
{
f(n-1,a,c,b);
move(a,c);
f(n-1,b,a,c);
}
}
void main()
{
int n;
scanf("%d",&n);
f(n,'a','b','c');
}
這是我的代碼 前面的是定義一個函數 這里遞歸體現在函數裡面還有函數 於是會一次又一次的計算 直到最後把N-1以前的都移到B,最下面的移到C,再把其他的從B移到C。。 無返回的話 應該是這里用void 沒有return返回數值

㈤ C語言漢諾塔(高分提問)

其實漢諾塔就是遞歸問題,你理解了遞歸思想,自然就很容易懂,這種問題一般都作為編程語言教程的遞歸例子講解的,你其實可以仔細看看課本的.
hanio(n-1,a,c,b);// 這語句的意思是:首先將a 上面的n-1個盤通過c 移動到b ,這樣的結果是,a 只剩下最大一塊盤,然後直接移動到c就行了,所以也就有move(a,c); 之後a 為空,b 有剛才移動的n-1個盤,c 上面已經有個最大的了,如果把剩下的n-1移動到c ,就完成了,所以接著有下面的語句:
hanio(n-1,b,a,c); //這意思說,把b 上的n-1個盤通過a 移動到c,
就這樣完成遞歸,一次次執行下去,就行了.

㈥ C語言漢諾塔

根據漢諾塔的游戲規則可知,若只有一個盤子,則只要直接搬運就可以了,其它的不需要再做。return語句的作用,就是遇到它時,程序直接返回到調用它的地方,不再執行此函數中return語句以後的代碼。

不過這里這個return語句也可以不寫,只是代碼要稍作更改(代碼的執行還是不變的,即與更改前完全等價):

voidhanNuoTa(intn,charfrom,charto,charhelper)
{
if(n==1)
{
printf("%c--->%c ",from,to);
}
else
{
hanNuoTa(n-1,from,helper,to);
printf("%c--->%c ",from,to);
hanNuoTa(n-1,helper,to,from);
}
}

㈦ C語言實驗題——漢諾塔

【例】Hanoi塔問題
一塊板上有三根針,A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。如圖5.4所示。要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以藉助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。
本題演算法分析如下,設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)
{
if(n==1)
printf("%c-->%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}

從程序中可以看出,move函數是一個遞歸函數,它有四個形參n,x,y,z。n表示圓盤數,x,y,z分別表示三根針。move 函數的功能是把x上的n個圓盤移動到z上。當n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞歸調用move函數,把n-1個圓盤從x移到y;輸出x→z;遞歸調用move函數,把n-1個圓盤從y移到z。在遞歸調用過程中n=n-1,故n的值逐次遞減,最後n=1時,終止遞歸,逐層返回。當n=4 時程序運行的結果為:
input number:
4
the step to moving 4 diskes:
a→b
a→c
b→c
a→b
c→a
c→b
a→b
a→c
b→c
b→a
c→a
b→c
a→b
a→c
b→c

㈧ C語言函數遞歸調用漢諾塔問題

我一步步的給你講,就會懂啦:

首先hanoi函數如果把當中的move函數給去掉,就變成了:

voidhanoi(intn,charone,chartwo,charthree)
{
if(n==1)
printf("%c->%c ",one,three);
else
{
hanoi(n-1,one,three,two);
printf("%c->%c ",one,three);
hanoi(n-1,two,one,three);
}
}

也就是把move(one,three),變成了printf("%c->%c ", one, three);。少了一個函數,更加清晰

所以這里的hanoi函數就有了執行的內容:printf

下面以3個盤子為例進行模擬計算機的執行過程:

1、hanoi(3,A,B,C),開始了這步,進入第一層函數,計算機在函數中會進行自我的再次調用(第7行代碼)

2、(第7行):hanoi(2,A,C,B),於是這又是一個新的hanoi函數,這里我把它成為第二層函數

同樣執行到第7行,卡住了,再次一次自我的調用

3、(進入第三層函數):hanoi(1,A,B,C),這里的第三層n=1,所以在第四行就顯示出了"A->C",至此,第三層函數結束,回到調用他的第二層函數

4、在第二層當中,繼續第8行的內容,所以顯示出"A->B",繼續運行,到第9行,開始了有一次自我調用

5、把她稱為貳號第三層函數吧。。。hanoi(1,B,A,C),和第3步類似,這一層函數顯示出了"B->C",然後結束函數,返回調用它的第二層函數

6、第二層函數執行完畢,返回調用它的第一層函數

7、第一層函數中執行到第8行,顯示出"A->C",然後執行第9行:hanoi(2,B,A,C)

............

如果看到了這里理清楚了關系就會懂啦,接下來還有一半,如果都寫下來就太復雜了-。-

你所說的空函數是指沒有返回值,但是這里利用的是電腦調用函數的那種關系來解決的問題,比如上面的3步,會自動返回到第二層函數並繼續

還可以這樣理解漢諾塔,漢諾塔其實是將復雜的問題簡單化,

先不管他有多少個盤子從A到C,我只把它視作3步

就像上面那樣找個例子,反復的按照代碼模擬計算機運行,過個五次六次,就會懂啦

㈨ 在C語言中用函數編寫漢諾塔

*問題分析與演算法設計
這是一個著名的問題,幾乎所有的教材上都有這個問題。由於條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:
18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(並不輸出)一次移動,那麼也需要幾乎一百萬年。我們僅能找出問題的解決方法並解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。
分析問題,找出移動盤乎渣穗子的正確演算法。
首先考慮a桿下面的盤子而非桿上最上面的盤子,於是任務變成了:
*將上面的63個盤子移到b桿上;
*將a桿上剩下的盤子移到c桿上;
*將b桿上的全部盤子移到c桿上。
將這個過程繼續下去,就是要先完成移動63個盤子、62個盤子、61個盤子....的工作。
為了更清楚地描述演算法,可以定義一個函數movedisc(n,a,b,c)。該函數的功能是:將N個盤子從A桿上藉助C桿移動到B桿上。這樣移動N個盤子的工作就可以按照以下過程進行:
1) movedisc(n-1,a,c,b);
2) 將一個盤子從a移動到b上;
3) movedisc(n-1,c,b,a);
重復以上過程,直到將全部的盤子移動到位時為止。
*程序與程序注釋
#include<stdio.h>
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
void main()
{
unsigned n;
printf("please enter the number of disc:");
scanf("%d",&n); /*輸入N值*/
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b'); /*從A上藉助B將N個盤子移動到C上*/
printf("\t Total: %d\n",i);
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
/*從fromneedle上藉助toneedle將N-1個盤子移動到usingneedle上*/
++i;
switch(fromneedle) /*將fromneedle 上的一個盤子移到toneedle上*/
{
case 'a': switch(toneedle)
{
case 'b': printf("\t[%d]:\t%2d.........>%2d\n",i,n,n);
break;
case 'c': printf("梁歲\t[%d]:\t%2d...............>%2d\n",i,n,n);
break;
}
break;
case 'b'歲卜: switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<...............>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t %2d........>%2d\n",i,n,n);
break;
}
break;
case 'c': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<............%2d\n",i,n,n);
break;
case 'b': printf("\t[%d]:\t%2d<........%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
/*從usingneedle上藉助fromneedle將N-1個盤子移動到toneedle上*/
}
}