afternoon of konoha:谁给个C语言汉诺塔递归算法及其详细注释

来源:百度文库 编辑:神马品牌网 时间:2024/04/27 13:41:50
main()
{
int n;
void hanoi(int n,char a,char b,char c);
printf(";lease enter the number of disks to be moved:");
scanf("%d",&n);
hanoi(n,'a','b','c');
}
void hanoi(int n,char a,char b,char c)
{
if(n>0)
{hanoi(n-1,a,c,b);
printf("\n move disc %d from pile %c to %c",n,a,b);
hanoi(n-1,c,b,a)};
}

程序怎么执行啊?

源代码:
#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);
}
}

其实递归并不复杂。初学者可能对有尾部递归的程序理解不了,建议先理解一下二叉树遍历过程的递归实现,再对照来理解这种程序执行过程。

谭浩强对递归的那段叙述可为经典,找一个和尚,把63个盘子挪好,这个和尚又找一个和尚,挪62个盘子……最后,最轻松的那个和尚把1个盘子挪个地方,这就是递归

以上。
敬仰的老狼

shangwang