这是xg111net一个汉诺塔程序,在各数据结构和算法设计的书中都有涉及,是递归的必修课
#include
void main()
void hanoi(int n,char one,char two,char three);//函数声明
int m;
printf("input the nuber of deskes:");
scanf("%d",&m);
printf("The step to moving %d deskes:n",m);
hanoi(m,’A’,’B’,’C’);//函数调用
void hanoi(int n,char one,char two,char three)
void move(char x,char y);//函数声明
if(n==1)move(one,three);//条件成立,调用“void move(char x,char y)”函数
else
hanoi(n-1,one,three,two);//调用函数本身
move(one,three);//调用“void move(char x,char y)”函数
hanoi(n-1,two,one,three);//调用函数本身
void move(char x,char y)
printf("%c--->%cn",x,y);
“hanoi(n-1,one,three,two);//调用函数本身
move(one,three);//调用“void move(char x,char y)”函数
hanoi(n-1,two,one,three);//调用函数本身”
这段代码是精髓,你太平洋xg111可以以n=3来进行分析:
开始3个都在A(one)上面,目标是吧这三个移动到C上;
hanoi(n-1,one,three,two)是以C(three)为媒介,将3-1=2个移动到B(two)上,为什么要以C为媒介进行移动呢,因为汉诺塔的规则规定,每次只能移动一个,而且大的一定要在小的下边。
完成这一步之后,的情况是A(one)上还剩下一个最大的,C(three)上什么都没有,B(two)上有一个最小的和一个中等的。
然后用move(one,three)把A上剩下的最大的移动到目标C(three)上。
然后在调用hanoi(n-1,two,one,three)把B(two)上的两个以A(one)为中转移动到C上。则所有步骤完成。
最好实际玩两把就能更深刻的理解了xg111net企业邮局