卯乐 发表于 2018-4-21 21:15:13

汉诺塔问题看下谢谢

本帖最后由 卯乐 于 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;
}      

洛臻 发表于 2018-4-21 21:45:16

汉诺塔一共分为三个步骤,第一步把n-1的盘子借助C放到B,第二部把A挪到C,第三部把B上面的N-1个盘子借助A挪到C。仔细看递归调时ABC的位置,你会发现和汉诺塔的三个步骤时一样的。这个问题感觉说不清楚,只能靠个人理解,我刚开始学到这里的时候也没听明白老师怎么讲的。后来感觉理解的多一些了,主要还是要理解递归的思想。比如只有五个盘子,第一步你要借助C把四个盘子挪到B。而这第一步你也可以分解成三步,第一步把三个盘子借助B挪到C,然后这还能分解成三步。。。有一个规律是如果盘子是奇数的,则第一个盘子先挪到C,如果是偶数第一个盘子则先挪到B。

卯乐 发表于 2018-4-21 22:03:54

这个汉字思想我明白就是代码的话有点不懂。

卯乐 发表于 2018-4-21 22:04:25

洛臻 发表于 2018-4-21 21:45
汉诺塔一共分为三个步骤,第一步把n-1的盘子借助C放到B,第二部把A挪到C,第三部把B上面的N-1个盘子借助A挪 ...

这个汉字思想我明白就是代码的话有点不懂。

洛臻 发表于 2018-4-21 22:29:29

卯乐 发表于 2018-4-21 22:04
这个汉字思想我明白就是代码的话有点不懂。

单步调试调试你就明白了,看看与你设想的一不一样,不一样的琢磨琢磨为什么,慢慢的就好了,这需要时间,刚学到这个我也不懂,后来慢慢的不知道怎么的理解就越来越深了。

卯乐 发表于 2018-4-22 13:43:13

嗯,知道了。不过没电脑,想买个2000以下二手的笔记本,又怕用不了
页: [1]
查看完整版本: 汉诺塔问题看下谢谢