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

c語言漢諾塔遞歸寫法

發布時間: 2022-08-28 06:32:53

① 求C漢諾塔遞歸詳細過程

首先main函數調用hanoi(int n,char a,char b,char c)
此時,n=4,a=A,b=B,c=C。
然後hanoi(n-1,a,c,b)又開始調用函數hanoi(int n,char a,char b,char c)
此時,hanoi(n-1,a,c,b)中實參的值是這樣的hanoi(4-1,A,C,B)
根據實參與形參對應關系, n=3,a=A,c=B,b=C。
剩下的類似這樣。

c語言算漢諾塔,遞歸時的輸出是怎麼一步一步來的如圖,求大神幫忙

例如,n=3,三個柱子是ABC

那麼是這樣:

調用的層次已經用製表符分開

hanoi(3,A,B,C)=>
hanoi(2,A,C,B)=>
hanoi(1,A,B,C)
=>move(1,A,C)
move(A,B)
hanoi(1,C,A,B)
=>move(C,B)
move(A,C)
hanoi(2,B,A,C)=>
hanoi(1,B,C,A)=>
move(1,B,A)
move(B,C)
hanoi(1,A,B,C)=>
move(1,A,C)

③ c語言遞歸調用漢諾塔

//代碼如下:
//說明:A,B,C為三個載體,起始,中間,目的載體為相對的,
//1.將n-1個盤子從起始載體通過目的載體,移動到中間載體
//2.只有最後一個盤子了.你需要將最後一個盤子從起始載體移到目的載體即可
//3.再將n-1個盤子從剛才的中間載體通過起始載體移動到目的載體.完成
//4.在遞歸時遇到只有1個盤子那直接從起始介質移到目的介質就OK了.
//自己用紙畫畫吧,不太好理解.明白了就不難了.
#include

#define
DISKA
"A"
#define
DISKB
"B"
#define
DISKC
"C"
void
move(int
num,char
*fromp,char
*mediump,char
*top);
void
mv(char
*fp,char
*tp);
int
main()
{
printf("please
input
the
num
of
disk:");
int
num;
scanf("%d",&num);
move(num,DISKA,DISKB,DISKC);
return
0;
}
void
move(int
num,char
*fromp,char
*mediump,char
*top)
{
if(num
==
1)
{
mv(fromp,top);//4
}
else
{
move(num-1,
fromp,
top,
mediump);//1
mv(fromp,top);//2
move(num-1,
mediump,
fromp,
top);//3
}
}
void
mv(char
*fp,char
*tp)
{
printf("%s--->%s\n",fp,tp);
}

④ 求C語言漢諾塔源碼(遞歸和非遞歸都要)

遞歸演算法是我前些天寫的,非遞歸是剛才找的,裡面含遞歸和非遞歸。
遞歸演算法:
#include <stdio.h>
//遞歸求漢諾塔問題
void hanoi(int n, char A, char B, char C, int *time)
{
if (n>=1)
{
hanoi(n-1, A, C, B, time);
move(A, C);
(*time)++;
hanoi(n-1, B, A, C, time);
}
}
//列印出每一步的路徑
void move(char a, char c)
{
printf(" %c-->%c\n", a, c);
}

int main(void)
{
int n, time = 0;;
printf("請輸入漢諾塔的盤數:");
scanf("%d", &n);
printf("%d個盤的漢諾塔移動方法是:", n);
printf("\n");
hanoi(n, 'A', 'B', 'C', &time);
printf("移動了%d次\n", time);
system("pause");
return 0;
}

非遞歸演算法:
#include <stdio.h>

#define MAXSTACK 10 /* 棧的最大深度 */

int c = 1; /* 一個全局變數,表示目前移動的步數 */

struct hanoi { /* 存儲漢諾塔的結構,包括盤的數目和三個盤的名稱 */
int n;
char x, y, z;
};

void move(char x, int n, char y) /* 移動函數,表示把某個盤從某根針移動到另一根針 */
{
printf("%d-> %d from %c -> %c\n", c++, n, x, y);
}

void hanoi(int n, char x, char y, char z) /* 漢諾塔的遞歸演算法 */
{
if (1 == n)
move(x, 1, z);
else {
hanoi(n - 1, x, z, y);
move(x, n, z);
hanoi(n - 1, y, x, z);
}
}

void push(struct hanoi *p, int top, char x, char y, char z,int n)
{
p[top+1].n = n - 1;
p[top+1].x = x;
p[top+1].y = y;
p[top+1].z = z;
}

void unreverse_hanoi(struct hanoi *p) /* 漢諾塔的非遞歸演算法 */
{
int top = 0;

while (top >= 0) {
while (p[top].n > 1) { /* 向左走到盡頭 */
push(p, top, p[top].x, p[top].z, p[top].y, p[top].n);
top++;
}
if (p[top].n == 1) { /* 葉子結點 */
move(p[top].x, 1, p[top].z);
top--;
}
if (top >= 0) { /* 向右走一步 */
move(p[top].x, p[top].n, p[top].z);
top--;
push(p, top, p[top+1].y, p[top+1].x, p[top+1].z, p[top+1].n);
top++;
}
}
}

int main(void)
{
int i;
printf("遞歸:\n");
hanoi(3, 'x', 'y', 'z');
printf("非遞歸:\n");
struct hanoi p[MAXSTACK];
c = 1;
p[0].n = 3;
p[0].x = 'x', p[0].y = 'y', p[0].z = 'z';
unreverse_hanoi(p);

return 0;
}

⑤ 漢諾塔n=4(4個盤)c語言遞歸編程代碼


/****************************
漢諾塔的演算法就3個步驟:
第一,把a上的n-1個盤通過c移動到b。
第二,把a上的最下面的盤移到c。a成了空的。
第三,因為n-1個盤全在b上了,所以把b當做a.
重復以上步驟就好了。所以演算法看起來就簡單多了。
******************************/
#include<stdio.h>

staticintm=0;

voidmove(intn,chara,charb,charc)
{

if(n==1)
{
m++;
printf("第%d次移動: ",m);
printf(" %c->%c ",a,c);//當n只有1個的時候直接從a移動到c
}
else
{
move(n-1,a,c,b);//第n-1個要從a通過c移動到b
m++;
printf("第%d次移動: ",m);
printf(" %c->%c ",a,c);
move(n-1,b,a,c);//n-1個移動過來之後b變開始盤,b通過a移動到c,這邊很難理解
}
}

intmain()
{
intn=4;
//printf("請輸入要移動的塊數:");
//scanf("%d",&n);
move(n,'a','b','c');
return0;
}

⑥ 誰能給我講一下,用c語言編寫的漢諾塔程序,是怎麼實現遞歸的啊

我看你是不了解遞歸函數的具體是怎麼實現的,我給你舉一個簡單的例子:就拿階乘來說吧,

我給你把具體實現的過程畫出來

當n=0時,就一步一步返回。這一點很重要。希望對你有幫助。

⑦ 誰給個C語言漢諾塔遞歸演算法及其詳細注釋

源代碼:
#include<stdio.h>

void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
int main()
{
unsigned n;
printf("please enter the number of locomotive:");
scanf("%d",&n); //輸入N值
printf("\tneedle:\t a\t b\t c\n");
movedisc(n,'a','c','b'); //從A上藉助B將N個盤子移動到C上
//*********************************************************************
//在此處加入如下代碼將C上的N個盤子再移回A 去掉此處代碼即漢諾塔問題源代碼
for(int j=1;j<=(int)n;j++)
{
i++;
printf("\t[%d]:\t%2d<-------------%2d\n",i,j,j);
}
//*********************************************************************
printf("\tTotal:\t%d\n",i);
scanf("%d",&n);
return 0;
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
//從fromneedle上藉助toneedle將N-1個盤子移動到usingneedle上
movedisc(n-1,fromneedle,usingneedle,toneedle);
++i;
//將fromneedle 上的一個盤子移到toneedle上
switch(fromneedle)
{
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\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\t%2d<-----%2d\n",i,n,n);
break;
}
break;
}
//從usingneedle上藉助fromneedle將N-1個盤子移動到toneedle上
movedisc(n-1,usingneedle,toneedle,fromneedle);
}
}

⑧ c語言用遞歸實現漢諾塔

見代碼注釋,還有不懂可以問。

#include<stdio.h>
voidmove(charx,chary)
{
printf("%c-->%c ",x,y);
}
//hannuota函數的作用:把n個圓盤從one柱子藉助two柱子放到three柱子
voidhannuota(intn,charone,chartwo,charthree)
{
if(n==1)//如果只有一個柱子
move(one,three);//直接移動即可
else
{
hannuota(n-1,one,three,two);//先把one柱子上的n-1個圓盤藉助three柱子移動到柱子two
move(one,three);//把第一個柱子的剩下那一個(第n個)移動到第三個柱子
//由於原來one柱子上的n-1個圓盤已經移動到了two柱子上,因此不會有圓盤擋住n圓盤出來
hannuota(n-1,two,one,three);
//最後再把那n-1個圓盤從two柱子藉助one柱子移動到three柱子
//(上面第一句話hannuota(n-1,one,three,two)已經移動到了two柱子,因此這里是從two柱子移動到three柱子)
}
}
intmain()
{
intm;
printf("inputthenumberofdiskes:");
scanf("%d",&m);
printf("Thesteptomove%ddiskes: ",m);
hannuota(m,'A','B','C');
return0;
}

⑨ 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步

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