函数递归中的“汉诺塔问题”

汉诺塔问题

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

在这里插入图片描述
为了方便起见,假设a上只有三个圆盘,将a中的圆盘依然按从上到下依次增大的顺序移到c圆盘。
解决这个问题显然要用到递归的思路。
第一步:将a座上面2个盘子移到b座上(借助c座)用递归的方法分解为

  • 将a座上的最上面的那个盘子从a座移到c座;

  • 将a座上中间的那个盘子从a座移到b座;

  • 将移到c座上的那个盘子移到b座。
    第二步:将a座最下面1个盘子移到c座。
    第三步:将b座上的2个盘子移到c座上用递归分解为

  • 将b座最上面的盘子从b座移到a座上;

  • 将b座上剩下的那个盘子从b座移到c座;

  • 将a座上剩下的那个盘子移到c座。
    将以上综合起来,移动3个盘子的步骤为
    a----c, a—b, c—b, a—c, b—a, b—c, a—c
    共经历7步,由此推出:移动n个盘子要经历(2^n-1)步。
    对以上操作用函数实现:

#include<stdio.h>
void hanoi(int n,char one,char two,char three)
//将n个盘子从one座借助two座移到three座
 {
  void move(char x,char y)
  if(1==n)
    move(one,three);
    else
      {
       hanoi(n-1,one,three,two);
       move(one,three);
       hanoi(n-1,two,one,three);
      }
  }
void move(char x,char y)
{
    printf("%c-->%n",x,y);
}
int main()
{
   void hanoi(int n,char one,char two,char three);
   int m=0;
   printf("input the number of diskes:");
   scanf("%d",&m);
   printf("The step to move %d diskes:\n",m);
   hanoi(m,'a' ,'b' ,'c');
   return 0;
 }

本程序中,调用递归函数hanoi,其终止条件为hanoi函数的参数n的值等于1。

猜你喜欢

转载自blog.csdn.net/tangya3158613488/article/details/83033016