点击蓝字 关注我们

本话内容

请输入

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请使用C++程序模拟汉诺塔移动金盘的过程。

对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。

假设移动盘子数为n,为了将这n个盘子从A柱移动到C柱,可以做以下三步:

  1. 以C柱为中介,从A柱将n-1个盘子移至B柱;

  2. 将底下那个盘子直接从A柱移到C柱;

  3. 以A柱为中介,从B柱将n-1个盘子移至C柱;

上面的3个步骤中,第2步可以直接一步完成,而第1步和第3步并不能直接完成,细心研究发现剩下的n-1个圆盘也可以重复再一次执行上面这3个步骤,在这里可以使用递归的方式。另外如果只有一个圆盘,我们可以直接让它从起始位置移动终点,这也就是递归的终止条件。

#include
using namespace std;
// 定义一个自定义函数,参数含义为:
// n表示有多少个圆盘需要移动
// a表示起始位置
// b表示中转站
// c表示目的地
void move(int n, char a, char b, char c) {
   // 递归终止条件:当只有一个圆盘时,直接将它从起始位置移到目的地
   if (n == 1) {
       cout << a << " ------> " << c << endl;
   } else {
       // 调用自身:将n-1个从a通过c移到b
       move(n - 1, a, c, b);
       // 将最底下那个圆盘起始位置移到目的地
       cout << a << " ------> " << c << endl;
       // 调用自身:将n-1个从b通过a移到c
       move(n - 1, b, a, c);
   }
}
int main() {
   int n = 5;
   move(n, 'A', 'B', 'C');
   return 0;
}

加入“编程玩家俱乐部”知识星球,每天都能学到有意思的编程知识哦。

看漫画学C++

看漫画也能学C++?没错!编程玩家俱乐部新推出系列课程《看漫画学C++》,带你用轻松看漫画的方式来学习C++,本课程面向零基础学员,只要坚持学习并多思考和多练习,相信你一定会成为C++的编程高手!如果喜欢本课程,就收藏一下哦,转发给你的小伙伴们,大家一起来学习!

扫码关注哦

编程玩家俱乐部

微信号 : 编程玩家俱乐部

B站:编程玩家

官网:https://aicodeplayer.com

喜欢本篇内容请给我们点个在看

个盘子的汉诺塔需要移动几步_看漫画学C++039:递归解汉诺塔相关推荐

  1. 个盘子的汉诺塔需要移动几步_图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...

  2. 个盘子的汉诺塔需要移动几步_坨——理解递归实现quot;汉诺塔quot;代码的关键...

    我记得,大学学C语言时,在函数递归调用那一节有个作业,就是写汉诺塔.不少同学遭遇到困难.在知乎上遇见的就有: 如何理解汉诺塔的递归?​www.zhihu.com 题主发出悲鸣:"--学C++ ...

  3. Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...

  4. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  5. c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  6. 算法:递归(汉诺塔)

    要点:函数定义中调用函数自身的方式形成递归. 递归的定义:递归,就是在运行的过程中调用自己. 数学上有个经典的递归例子叫阶乘,阶乘通常定义如下: n! = n(n-1)(n-2)-(1) 为了算出这个 ...

  7. C语言——生存期和存储类型、递归、递归求解汉诺塔、快速排序

    目录 一.生存期和存储类型 1.生存期 2.存储类型 3.自动变量(auto) 4.寄存器变量(register) 5.静态局部变量(static) 6.static 和 extern 二.递归 1. ...

  8. 数据结构学习笔记:递归和汉诺塔问题

    什么是递归 在数据结构-树中,对于树的遍历采用的是递归来遍历的. 递归就好比套娃,在满足条件的情况下会一直调用本身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求 ...

  9. python实现汉诺塔递归经典算法_Python递归实现汉诺塔算法示例

    本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现 ...

最新文章

  1. 2015211230108《Java程序设计》第10周学习总结
  2. libgdx使用android控件,在Android上使用libGDX中的SQLite
  3. uniapp h5页面 在移动端 使用clipboardone.js插件实现 写入剪切板 -- 安卓和ios安美适配(仅测试部分机型)
  4. leetcode1267. 统计参与通信的服务器(dfs)
  5. github迁移到gitee相关问题
  6. 情人节,找个程序员当男朋友,一般都不会太差
  7. jsp mysql超市管理系统_jsp超市管理系统 基于jsp+servlet+MySQL的超市管理系统(带数据库) - 下载 - 搜珍网...
  8. 【报告分享】2020年中国数据驱动型企业成长路径研究报告.pdf(附下载链接)...
  9. Freemarker判断对象是否为空的用法
  10. Android FrameWork——Activity启动过程详解
  11. Objective-C中的UIScrollView
  12. 万兆网文件服务器,万兆以太网网卡网吧服务器中的应用
  13. 【STM32H7】第5章 ThreadX NetXDUO网络协议栈介绍
  14. 科沃斯扫地机器人哪个型号最实用_科沃斯扫地机哪个型号好 三个价位三种选择...
  15. 收到QQ尾巴 Worm.QQ.TopFox.bo 送来的“我的近照11.zip”
  16. JavaScript学习笔记2——JavaScript操作BOM对象
  17. 华擎主板bios设置图解_华擎主板bios设置_华擎主板bios设置图解_asrock主板bios设置...
  18. ubuntu中静态ip的修改配置
  19. 《操作系统》期末复习题
  20. jacob操作word和excel

热门文章

  1. 想要更快地使用AtomicLong? 等待它。
  2. 选择技术栈构建通用平台
  3. Spring Integration关键案例与现实生活场景
  4. JavaFX逆运动学库2.0
  5. 使用内存映射文件获取巨大的矩阵
  6. go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态
  7. 报错java.lang.NoClassDefFoundError: ognl/DefaultMemberAccess
  8. IntelliJ IDEA修改项目的包名_修改包名
  9. MySQL数据库模式(SQL_MODE)中的STRICT_TRANS_TABLES和STRICT_ALL_TABLES
  10. java魔兽猎人_Java基于Swing实现的打猎射击游戏代码