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。
最后更新于 2023-10-11 08:36:29 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章