文章目录

  • 前言
  • 一、何为汉诺塔
  • 二、问题分析
  • 三、算法实现

前言

汉诺塔是一款有趣的智力游戏,其求解问题在数据结构与算法中也是堆栈思想和递归思想的典型案例。


一、何为汉诺塔

如图所示:有A、B、C三个杆,A杆上放有自上而下直径依次递增的圆盘,要将所有圆盘从A杆移动到C杆,并保持原来的叠放顺序,圆盘的放置可借助B杆,搬动时还需遵守以下规则:
1、直径较小的圆盘永远只能置于直径较大的圆盘之上。
2、圆盘可以任意的从任何一个木桩移动到其他的木桩上。
3、每次只能移动一个圆盘,而且只能从木桩最上面的开始移动。

二、问题分析

设有n个圆盘,对于汉诺塔的最小步数求解,进行一层抽象,无非是三个步骤:

1、将n - 1个圆盘,从A杆移动到B杆。
2、将第n个,即最大的圆盘,从A杆移动到C杆。
3、将n - 1个圆盘,从B杆移动到C杆。

当第n个圆盘移动到C杆,我们可以将B杆视为A杆,A杆视为B杆,重复步骤,因为此时第n个圆盘到达了目标位置,而前n - 1个圆盘都可放置于第n个圆盘之上,就可将归位的第n个圆盘视为无。

借助B杆,将第n个圆盘从A杆移动到C杆所需的最小步数为2n-1,依次类推,求解的最小步数就是一个等比数列的求和,解为2n - 1。

三、算法实现

代码如下(C#实现):

//求解汉诺塔问题中,移动n个圆盘的最少步骤过程
static void Hanoi(int n, string A = "A", string B = "B", string C = "C")
{if(n == 1){Console.WriteLine($"从{A}杆移动到{C}杆");}else{Hanoi(n - 1, A, C, B);Console.WriteLine($"从{A}杆移动到{C}杆");Hanoi(n - 1, B, A, C);}}

堆栈思想案例—汉诺塔问题求解最小步数相关推荐

  1. 三阶汉诺塔java源代码_如何使用Java实现汉诺塔问题求解

    如何使用Java实现汉诺塔问题求解 时间:2017-09-28     来源:华清远见JAVA学院 汉诺塔问题是一个经典的问题,常常被用来测试对递归算法的理解程度,今天华清Java学院小编就和大家分享 ...

  2. C语言递归思想实现汉诺塔

    目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够 ...

  3. 汉诺塔python创新设计_递归经典案例汉诺塔 python实现

    最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...

  4. python递归函数例子_Python递归函数经典案例-汉诺塔问题

    汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传说,大梵天创世时制作了三根金刚石石柱,在第一根柱子上从上往下从小到大摞着64片金盘,婆 ...

  5. 分治法基本思想(汉诺塔问题 Tower of Hanoi)

    文章目录 前言 基本思想 适用的问题 求解步骤 分治法要点 时间复杂性分析 举例-汉罗塔问题(Tower of Hanoi) 问题描述 解决步骤 java代码 前言 分治法来源于孙子兵法谋攻篇中写道- ...

  6. 汉诺塔问题java编程,Java经典编程300例之实例047 汉诺塔问题求解(递归)

    实例说明 汉诺塔问题的描述如下:有A.B和C 3跟柱子,在A上从下往上按照从小到大的顺序放着64个圆盘,以B为中介,把盘子全部移动到C上.移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的 ...

  7. Java递归基础案例-汉诺塔

    汉诺塔问题 /** * Title: 汉诺塔问题 * Description:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上. * 有一个和尚想把这64个 ...

  8. 基于C语言和递归思想实现汉诺塔

    汉诺塔是源于印度一个古老传说的益智玩具. 传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...

  9. 汉诺塔的非递归实现(借助堆栈模拟递归)

    汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...

最新文章

  1. 浅析企业网站建设潜在价值有哪些?
  2. Angular--TypeScript finalize 方法
  3. Linux Shell常用技巧(一)
  4. Google 开源的 Android 排版库:FlexboxLayout
  5. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
  6. 在Ubuntu 16.04 安装python3.6 环境并设置为默认
  7. oracle把两个字段拼接在一起,请问Oracle中两个日期拼接在一起的语句应该怎么写?...
  8. EMNLP'21 Findings|字节火山翻译提出:基于自修正编码器的神经机器翻译
  9. UltraEdit如何激活
  10. SAS实验2——假设检验
  11. Excel中RATE函数的Java实现欢迎加入我的星球
  12. 光E电小家庭要如何理财
  13. smartupload下载
  14. Vue全家桶入门精细讲解
  15. (转)Android系统WAP上网设置
  16. 180205 Coursera用户批量下载课程资源的方法
  17. LeetCode 695. 岛屿的最大面积【c++/java详细题解】
  18. __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码
  19. 计算机英语短句,有意义的英文短句
  20. UIImageView 使用 padding 为图片设置内边距的 2 种方案

热门文章

  1. POJ 1753 Flip Game(递归枚举)
  2. 一篇工作调动时的旧文
  3. java具名参数_Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)...
  4. OpenHarmony如何控制屏幕亮度
  5. APPLE G5 机箱改造“黑苹果”全攻略
  6. 从逐利到协力 「DAO」阻且长
  7. 2.4 旋转曲面 (1)
  8. 直线绕z轴旋转所成曲面的方程
  9. 案例-------ZARA和HM
  10. 微信小程序获取页面高度