Hanoi塔问题的大意是将所有的盘子从最左边(from)的柱子转移到最右边的柱子(to)上,可以借助中间的柱子(temp)。
而且移动过程中要满足一下规则:
1:每次只能移动1个圆盘
2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上
Hanio塔问题是一道经典的递归问题了,但是很多人第一次看都会一脸懵逼。因为他们看到的代码是这样的:
#include<stdio.h>
void hanoi(int n,char A,char B,char C)
{
if (n>0)
{
hanoi(n-1,A,C,B);
printf("%c→%c\n",A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
hanoi(3,'A','B','C');
}
还没领会到算法的本质,就已经在ABC的世界中找不到北了。。。
递归算法最大的优点之一就是可读性性、实现简单,然而上面的代码显然不是这样。问题就出在参数命名上,ABC这样的名字实在是太容易让人混淆了~
其实Hanoi的递归算法很简简单单:
- 先把 个盘子从from放在temp上,
- 把from上剩下的一个盘子(也就是最底下的盘子)放到to上。
- 把temp上的 个盘子放到to上。
只不过在放的过程中from、to、temp角色会发生变化,但放法都是一样的。
#include<stdio.h>
void hanoi(int n,char from,char temp,char to)
{
if(n>0)
{
//第一步
hanoi(n-1,from,to,temp);
//第二步
printf("%c move to %c\n",from,to);
//第三步
hanoi(n-1,temp,from,to);
}
}
int main()
{
hanoi(3,'A','B','C');
}
只要心中明确hanoi中各个位置参数的含义,就可以掌握hanoi的递归写法啦。