C语言汉诺塔(高分提问)

来源:百度知道 编辑:UC知道 时间:2024/05/31 12:15:02
#include <stdio.h>
void hanio(int n,char a,char b,char c)
{
void move(char x,char y);
if(n==1)
move(a,c);
else
{
hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)
move(a,c);
hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)
}
}
void move(char x,char y)
{
printf("%c---->%c\n",x,y);
}
void main()
{
clrscr();
hanio(3,'A','B','C');
}

最好是能多给点注释,谢谢

hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)
move(a,c);
hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)

其实如果清楚了移动规则,这个就很简单了.
分析有两个盘子的情况,显然为:
a-b
a-c
b-c
假设有n个盘子,我们也可以看作两个盘子,其中最上面的一个为x,下面的n-1个为y,那么这两个盘子的以后就和上面一样
x:a-b
y:a-c
x:b-c
而那n-1个盘子也可以用同样方法处理.这样我们像有了一个公式:
if(n==1)
直接将一个盘子从a移动到c;
else
{
先将n-1个盘子从a移动到b;
把第n个盘子从a移动到c;
将n-1个盘子从b移动到c;
}
这样就完成了移动,如果明白了这个,那么前面的就好懂了,
hanio(n-1,a,c,b); //因为hanio函数实际移动的是char a,char c,也就是第二和第四个参数,所以这儿可以看成把n-1个盘子从a移动到b;
move(a,c);
hanio(n-1,b,a,c); //这儿可以看成把n-1个盘子从a移动到b;

其实汉诺塔就是递归问题,你理解了递归思想,自然就很容易懂,这种问题一般都作为编程语言教程的递归例子讲解的,你其实可以仔细看看课本的.
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,
就这样完成递归,一次次执行下去,就行了.

你的程序是模拟汉诺塔的操作过程,将每一步的执行方法打印出来;
主程序采用递归方式