递归算法—汉诺塔问题

 题目内容

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

 

 问题1:先考虑若将A中圆盘全部移至C上,需要多少步?

 思路:想将A的圆盘全部移动到C上,先考虑最大的圆盘,此时一定会出现如图的情况:A只有最大的圆盘,C上为空,B上有 n-1 个圆盘(且符合条件)此时将A移至C上,再将B全部移至C(相当于将 n-1个圆盘移至C盘)

 可以得出关系式: F(n)=2*F(n-1)+1;  F(1)=1 --> F(n)=2^n-1

 问题2:输出移动圆盘操作的过程

思路:这个时候用递归的思想,将步骤拆成三个阶段

                1. 将 A 中的前 n-1 个盘全部移至 B盘的操作

                2. 将 A 中最底端的盘移至 C盘中的操作

                3. 将 B 中全部的 n-1 个盘 全部移至 C中

结束条件:当只一个盘的时候,从当前盘的位置移至C盘

核心代码: 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int n,m;
int sum;
void move(int s,char a,char b,char c) // 一共s个盘 全部在a中,借助盘c将其全部移至b中
{   // 第一次 a:A b:C c:B
   if(s==1)
   {
        printf("Step%d:%c->%c\n",++sum,a,b);
        return ;
   }
   else
   {
        move(s-1,a,c,b); // 将 A(a) 的n-1个圆盘全部移至B(c)
        printf("Step%d:%c->%c\n",++sum,a,b); // A(a)的最大盘 移至 C(b)
        move(s-1,c,b,a); //再将 B(c) 中n-1个盘移至 C(b)
   }
}
int main()
{
    scanf("%d",&n);
    move(n,'A','C','B');
    system("pause");
    return 0;
}

关于代码思路的理解:

        递归的操作比较抽象,但调试的方法可以很好的理解,遇到每一种情况,都存在相应的步骤,使得圆盘按照规定的顺序移动,代码中的 a b c 参数 没有固定,可以从任意盘移到其他盘,若对递归还不是很熟悉,需要加深理解!

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值