|
发表于 2018-4-21 21:15:13
From FishC Mobile
|
显示全部楼层
|阅读模式
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 卯乐 于 2018-4-21 21:31 编辑
关于递归的else不太懂
#include<stdio.h>
void move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void han(int n,char a,char b,char c)
{
if(n>0)
{
han(n-1,a,c,b);
move(a,b);
han(n-1,c,b,a);
}
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",(1<<n)-1);
han(n,'A','B','C');
return 0;
}
汉诺塔一共分为三个步骤,第一步把n-1的盘子借助C放到B,第二部把A挪到C,第三部把B上面的N-1个盘子借助A挪到C。仔细看递归调时ABC的位置,你会发现和汉诺塔的三个步骤时一样的。这个问题感觉说不清楚,只能靠个人理解,我刚开始学到这里的时候也没听明白老师怎么讲的。后来感觉理解的多一些了,主要还是要理解递归的思想。比如只有五个盘子,第一步你要借助C把四个盘子挪到B。而这第一步你也可以分解成三步,第一步把三个盘子借助B挪到C,然后这还能分解成三步。。。有一个规律是如果盘子是奇数的,则第一个盘子先挪到C,如果是偶数第一个盘子则先挪到B。
|
|