当前位置: 首页 > news >正文

[one_demo_10]递归解决汉诺塔问题

3个座abc,开始时在a座上有64个盘子,盘子大小不等,大的在下,小的在上。把64个盘子从a座移动到c座,规定每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用b座。编程实现移动盘子的步骤。

分析,如果只有1个盘子,是移动一次;如果是2个盘子,移动3次;如果是3个盘子,是移动7步。推测,移动的公式是2n次方-1

递推移动的机制,将移动n个盘子看成是移动第n个和n-1个,那么,将n-1看成是一个整体,相当于移动2个盘子,从示意图中可以看出移动n个盘子将相当于将n-1个从a移动到b的次数加上从b移动到c的次数再加上第n个移动的1次,相当于前n-1个盘子整体移动了两次,而在这种从一个底座移动到另一个底座的最短算法是一样多的,也就是前n-1个盘子两次移动到c,算术表示就是2*n-1移动到c的次数),总体上移动n个盘子,也就是相当于:2*(前n-1个盘子移动到c盘的次数)+1nn-1这个整体移动到c示意如

                             a                b                c

                             n-1

开始时                   n

                  

1次移动              n                n-1                 

 

第2次移动                                n-1              n

                                                                   n-1

第3次移动                                                    n

那么,将n个盘子移动到c的结果就是2*(n-1个的移动到c的次数)+1,如此类推形成递归。递归结束的条件是n=1时为1。当n=2时为3,注意n=2时的情况也满足这个公式,所以以n=1为递归结束条件。从简单的数验证就是,比如n=3时,总次数等于到2*3+1等于7。

起始         a                b                c

kai           1

ss             2

起始         3

ss    

ss             2

ss             3                                   1

第1次    

ss              

ss              3                2                1

第2次    

ss                                  1

第3次         3                2                       (此时已经将前2个作为整体移动到了b,也相当于移动到c的次数,也就是移动了3次)

ss                                  1

第4次                            2                3     (这一次是将3移动到目标位置)

ss                                 

第5次         1                2                3       (接下来就是将前2个移动到c,也是3次)

ss                                                   2

第6次         1                                  3

ss                                                   1

ss                                                   2

第7次                                             3

那么模拟移动的步骤,根据示意图

                            a                b                c

                            n-1

开始时                  n

                  

1次移动             n                n-1             

 

第2次移动                               n-1             n

                                                                 n-1

第3次移动                                                  n

如果n大于1时,实际上是先移动n-1从a到b,再移动n到c,再移动n-1从b到c。

那么,编程实现

int hannuota(int a)

{

         if (a == 1)

         {

                   return 1;

         }

         else

         {

                   return 2 * hannuota(a - 1) +1;

         }

}

//设计递归函数,实现模拟移动的步骤

void hannuotazoufa(chara, char b, char c, int num)

{

         if (num == 1)

         {

                   printf("%c->%c\n",a, c);

         }

         else

         {

                   hannuotazoufa(a, c, b, num -1);

                   printf("%c->%c\n",a, c);

                   hannuotazoufa(b, a, c, num -1);

         }

        

}



void main()

{

         int panzi = 4;

         printf("请输入汉诺塔的盘子\n");

         scanf("%d", &panzi);

         int res = hannuota(panzi);

         printf("%d个盘子的汉诺塔移动次数为%d\n", panzi, res);

         printf("移动的方式为\n");

         hannuotazoufa('a', 'b', 'c', panzi);

         system("pause");

}

 

相关文章:

  • [one_demo_11]二分查找法
  • [one_demo_12]递归打印*\n*.*.\n*..*..\n图形
  • c
  • network
  • 使用javadoc生成项目的帮助文档
  • [one_demo_13]ArrayList去除重复的元素
  • web项目发布到tomcat的两种方式
  • androidBasic
  • mybatis使用like模糊查询防sql注入写法
  • maven整合ssm项目中报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  • dubbo简介
  • FastDFS简介
  • redis集群
  • solr集群
  • ssm框架web项目配置全局异常处理
  • [译]Python中的类属性与实例属性的区别
  • 【Linux系统编程】快速查找errno错误码信息
  • javascript数组去重/查找/插入/删除
  • java中具有继承关系的类及其对象初始化顺序
  • log4j2输出到kafka
  • Mac转Windows的拯救指南
  • Python socket服务器端、客户端传送信息
  • SQLServer之创建显式事务
  • TypeScript迭代器
  • ucore操作系统实验笔记 - 重新理解中断
  • vue脚手架vue-cli
  • XForms - 更强大的Form
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用putty远程连接linux
  • 以太坊客户端Geth命令参数详解
  • 仓管云——企业云erp功能有哪些?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (1)Android开发优化---------UI优化
  • (C语言)fgets与fputs函数详解
  • (C语言)二分查找 超详细
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (南京观海微电子)——COF介绍
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十) 初识 Docker file
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十一)图像的罗伯特梯度锐化
  • (算法设计与分析)第一章算法概述-习题
  • (学习日记)2024.02.29:UCOSIII第二节
  • .gitignore
  • .net 生成二级域名
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET学习全景图
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .stream().map与.stream().flatMap的使用
  • ??在JSP中,java和JavaScript如何交互?
  • [1181]linux两台服务器之间传输文件和文件夹