|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近学到递归,汉诺塔的递归,看了好久,但是总感觉有层纸没有捅破,虽然程序写出来了,但是是照着课本写出来的,要是自己想,不看答案的话,完全写不出来。那位大神有理解汉诺塔递归的通俗易懂的解释,代码也放上来,给更不明白的,有个视觉的理解。
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int plate[100][3]={{0},{0,0,0},{0,0,0}};
int a=0,b=1,c=2,position[100]={0};
int numbers,count=0,time=10;
void main()
{
int move(int,int,int);
int hanoi(int,int,int,int);
int i,j;
printf("请输入汉诺塔的层数:");
scanf("%d",&numbers);
printf("\n请输入下一步的间隔时间(毫秒):");
scanf("%d",&time);
printf("\n");
for(j=0;j<numbers;j++)
{
plate[j][a]=j+1;
position[j+1]=j;
}
printf("您输入的汉诺塔如下:\n");
for(j=0;j<numbers;j++)
{
for(i=0;i<=2;i++)printf("%10d",plate[j][i]);
printf("\n");
}
printf("按回车键继续\n");
getchar();
getchar();
hanoi(numbers,a,b,c);
printf("演示完成回车键退出\n");
getchar();
getchar();
}
int move(int m,int x,int y)
{
int i=0,j=0,p=0;
p=position[m];
for(j=numbers-1;j>=0;j--)
{
if(plate[j][y]==0)
{
plate[j][y]=plate[p][x];
position[m]=j;
plate[p][x]=0;
break;
}
else continue;
}
system("cls");
printf("\n");
for(j=0;j<numbers;j++)
{
for(i=0;i<=2;i++)printf("%10d",plate[j][i]);
printf("\n");
}
Sleep(time);
}
int hanoi(int n,int x,int y,int z)
{
int move(int m,int x,int y);
if (n==1)
{
count++;
//printf("第%d个,%c%c%c,%d次",n,x+65,y+65,z+65,count);
//printf("plate[%d][%d]%d,",n-1,x,plate[n-1][x]);
//printf("%c-->%c\n",x+65,z+65);
move(n,x,z);
}
else
{
hanoi(n-1,x,z,y);
count++;
//printf("第%d个,%c%c%c,%d次",n,x+65,y+65,z+65,count);
//printf("plate[%d][%d]%d,",n-1,x,plate[n-1][x]);
//printf("%c-->%c\n",x+65,z+65);
move(n,x,z);
hanoi(n-1,y,x,z);
}
}
|
|