Tower of Hanoi 简单易懂的写法

在这里插入图片描述
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的递归算法很简简单单:

  1. 先把 n 1 n-1 个盘子从from放在temp上,
  2. from上剩下的一个盘子(也就是最底下的盘子)放到to上。
  3. temp上的 n 1 n-1 个盘子放到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的递归写法啦。

猜你喜欢

转载自blog.csdn.net/guojunxiu/article/details/82945879