n阶汉诺塔问题的c语言

# includestdio.h

void hanoi(int n,char A,char B,char C)

{

如果(n==1)

{

printf("将磁盘%d从%c移动到%c\n ",n,A,C);

}

其他

{

河内(n-1,A,C,B);

printf("将磁盘%d从%c移动到%c\n ",n,A,C);

河内(n-1,B,A,C);

}

}

int main()

{

int n;

Printf("请输入数字N求解N阶汉诺塔问题:\ N ");

scanf("%d ",n);

hanoi(n,' A ',' B ',' C ');

返回0;

}

用非递归方法求解c语言中的汉诺塔问题 # includestdio.h

#define MAXSTACK 10 /*堆栈的最大深度*/

int c = 1;/*指示当前移动的步数的全局变量*/

存储汉诺塔的结构,包括磁盘的数量和三个磁盘的名称*/

int n;

char x,y,z;

};

Void move(char x,int n,char y) /* move函数,这意味着将磁盘从一个引脚移动到另一个引脚*/

{

printf("%d .将磁盘%d从%c移动到%cn ",c,n,x,y);

}

Void Hanoi (int n,char x,char y,char z)/*汉诺塔的递归算法*/

{

如果(1 == n)

移动(x,1,z);

否则{

河内(n - 1,x,z,y);

移动(x,n,z);

河内(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 un reverse _ Hanoi(struct Hanoi * p)/*汉诺塔的非递归算法*/

{

int top = 0;

while (top = 0) {

While (p[top].n 1) {/*向左走到最后*/

推(p,top,p[top]。x,p[top]。z,p[top]。y,p[top]。n);

顶;

}

If (p[top].n == 1) {/*叶节点*/

移动(p[top]。x,1,p[top]。z);

top-;

}

If (top = 0) {/*向右移动一步*/

移动(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);

顶;

}

}

}

int main(void)

{

struct Hanoi p[MAXSTACK];

printf("反向程序:n ");

hanoi(3,' x ',' y ',' z ');

printf("不可逆程序:n ");

c = 1;

p[0]。n = 3;

p[0]。x = 'x ',p[0]。y = 'y ',p[0]。z = ' z

unreverse _河内(p);

返回0;

}

C语言汉诺塔问题中汉诺塔(n-1,1,3,2)的实现方式 河内(n-1,一,三,二);

意思是把1柱上的板通过3柱移动到2柱上;

动(一,三);

将板从支柱1移动到支柱3;

河内(n-1,二,一,三);

意思是通过1号柱子把2号柱子上的板移到3号柱子上;

求神讲解一下C语言汉诺塔递归算法的简单理解。 起初,当我接触到河内塔时,我感到困惑。随着代码的积累,我现在已经很容易理解了。所以楼主对递归函数的理解还不够深入。建议你多写递归程序,等熟练了就能看懂了。

磁盘逻辑运动过程程序的递归过程分析

对于汉诺塔问题,算法分析如下。假设a上有n个板块,为了便于理解,我将这n个板块从上到下编号为n,标注为板块1,板块2...铭牌..

如果n=1,将“光盘1”直接从A移到c。

如果n=2,则:

(1)将A上的n-1(等于1)个磁盘移到B上,即把磁盘1移到B上;

(2)将A上的“盘2”移动到C上;

(3)最后,将B上的n-1(等于1)个磁盘移到C上,即步骤(1)中放在B上的磁盘1移到C上..

注意:因为这里不止一个盘子,所以不能直接把盘子从A移到c,要用b。

Yao hanoi(n,1,2,3)的意思是通过n个盘子从1移动到3,如果n2。

然后递归,如果n=1,那么直接移动。

具体流程:

河内(2,a,b,c);因为21,所以进入了递归环节。

1执行hanoi(1,A,C,B):这是上一步(1),意思是借助C柱把A柱上的一个盘(盘1)移到B柱上。实际上因为是n=1,所以此时并没有使用C柱,而是直接移动。

2执行hanoi(1,a,b,c):这是步骤(2)。在B柱的帮助下,将A柱上的磁盘(磁盘2)移动到C柱上。因为这里也是n=1,所以并没有真正借助b列直接移动。

3执行hanoi(1,B,a,c):这是步骤(3),把B上的一个菜(dish 1)移到c上。

因为函数中每次调用hanoi的n值都是1,所以不会进入递归,直接执行mov move函数。

如果n=3,则运动的倒数第二部分必须如下。

(1)将A上的N'-1(等于2)个圆盘移动到C上,即此时圆盘1和2都在B柱上,只有这样才能移动底部的圆盘(圆盘3)。然后,因为我们先忽略的最大的菜(菜3),我们现在的目标是借助C柱把两个菜(菜1和菜2)从A柱移到B柱,这个过程就是上面n=2时的移动过程,n=2的移动过程就是“两个菜,从A柱到C柱”。现在是“两块板,借助C柱从A柱移动到B柱”。因此,移动进程可以通过直接调用n=2的移动进程来实现。

(2)将a上的一个圆盘(圆盘3)移动到c上

(3)在这个阶段,由于最大的菜(菜3)已经移动到了目的地,无论后面怎么移动,我们都不需要使用最大的菜(菜3),所以先忽略它,剩下的目标是将B上的n-1个菜(菜1和菜2)移动到c上,由于A上没有菜,此时必须使用A来完成上述目标。最终的目的是在A的帮助下将B上的两块板移动到C上,这个过程就是n=2时的分析过程,只是初始的列(B列)与支撑的列(A列)不同。所以可以实现直接调用n=2的过程。

具体实施过程:

河内(3,a,b,c);因为31,所以进入了递归环节。

1执行hanoi(2,A,c,B):这代表上一步(1),借助c将两个板块(板块1和板块2)从A移动到B,按照n=2的分析流程,势必达到我们的目的。

2执行hanoi(1,A,b,c):现在A上只有一个盘子(盘子3),直接移到c上就行了。

3执行hanoi(2,B,a,C):此时对应步骤(3),剩下的目标是借助a将B上的两个盘子移动到C上,然后按照n=2的移动过程,就可以达到目标了。

最后在b的帮助下把三个盘子从A移到C。

相关文章

发表新评论