背景

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

2. 递归算法

分为3个步骤:

(1)将前面63个盘子从 X移动到Y

(2) 将第64个盘子,从X移动到Z

此时我们思考一个问题:我们第64个盘子是不是最大?它是不是已经永远不会动了?
所以我们是不是可以直接把这个东西看作没了?给我回答“是”,要不然我讲不下去。

(3) 将63个盘子从Y移动到Z

代码里面的这一步是:hanio(n-1, y , x , z);
我的理解是:现在我们把第64个盘子看做没了,是不是原本的问题变成了63个盘子,和最初的区别是一开始的64个盘子都在x上面,现在都在Y上面,所以我们把Y当成X去处理不就好了呀。
可以观看一下代码的执行:

n=3 n=2
x —> z
x —> y
z —> y
x —> z
y —> x x —> y
y —> z x —> z
x —> z y —> z

发现没?其实n=3时的后面三步,其实和n=2时的步骤是一样的,只不过x变成了y,x变成了y。
这就是代码中的这一步交换位置的原理所在。

问题一:将X上的63个盘子借助Z移动到Y(拆解思维)

将62个盘子从Y移动到X
将第63个盘子移动到Y
将62个盘子移动到Y

问题二:将Y上的63个盘子借助X移动到Z(拆解思维)

将62个盘子从Y移动到X
将第63个盘子移动到Z
将63个盘子移动到Y上

下面贴出代码:

#include<stdio.h>void hanio(int n, char x ,char y ,char z)
{if(n==1)printf("%c  ---> %c \n",x,z);else{hanio(n-1,x,z,y);printf("%c  ---> %c \n",x,z);hanio(n-1,y,x,z);}
} int main(int argc, char const *argv[])
{int n ;scanf("%d",&n);hanio(n,'x','y','z');return 0;
}

非递归算法

以后弄明白点再讲吧,先看3blue的汉诺塔视频

一脸懵逼的算法系列之汉诺塔相关推荐

  1. 【YBT高效进阶】1基础算法/1逆推算法/2奇怪汉诺塔

    [YBT高效进阶]1基础算法/1逆推算法/2奇怪汉诺塔 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 汉诺塔问题,条件如下: 这里有 ...

  2. 【离散数学中的数据结构与算法】十 汉诺塔

    汉诺塔也是经典的算法问题 文章目录 1 汉诺塔问题 1 汉诺塔问题 法国数学家卢卡斯(Edouard Lucas)在1883年提出了一个数学游戏: 传说在世界中心贝拿勒斯(印度北部)的圣庙里,一块黄铜 ...

  3. 算法- 分治算法(实现汉诺塔)

    package Algorithm.dac;public class Hannoitower {public static void main(String []args){hannoiTower(5 ...

  4. 汉诺塔算法python_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  5. 算法自我分析——汉诺塔算法

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

  6. 汉诺塔算法 java_java实现汉诺塔算法

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...

  7. 算法 - 递归实现汉诺塔(The Tower of Hanoi)

    目录 引言: 分析: 分析两片汉诺塔的迁移过程: 分析三片汉诺塔的迁移过程: 代码实现: 递归出口: 递归过程: 完整程序代码: 运行结果: 参考资料:​​​​​ 引言: 今天接触到了一个非常有意思的 ...

  8. 算法:图解汉诺塔问题(递归求解)

    汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子 ...

  9. 分治算法——汉诺塔(HanoiTower)

    分治算法--汉诺塔 介绍 分治算法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题···直到最后子 ...

最新文章

  1. OpenCV官方文档 理解k - means聚类
  2. 什么样的人适合做产品经理
  3. VC++文件监控(一) ReadDirectoryChangesW
  4. 计算机视觉子方向,计算机视觉方向简介 | 人脸识别中的活体检测算法综述
  5. 详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点
  6. MySQL Flow Control Statements(流程控制)
  7. 03 Java基本语句结构
  8. 前端-【学习心得】-合作登录相关
  9. java连接数据库增删改查公共方法
  10. w.php k,W/ (K·m)应读作( )。
  11. 安装JLINK驱动出现the firmware of the connected J-Link does not support the following memory access
  12. Docker安装Adguardhome
  13. 监控系统服务器时间怎么更改,监控系统服务器改时间
  14. 基于开路电压+安时积分法估算锂电池SOC(二)
  15. 一行代码完成Java的Excel读写 侵立删
  16. Delphi XE4 IOS 开发, No eligible applications were found“
  17. 伪类选择器(vscode)
  18. CSS简单实现圣杯布局和双飞翼布局
  19. HTML+CSS+JavaScript实现全国三级城市select选择
  20. Java通用权限管理系统第一天

热门文章

  1. BZOJ4471 : 随机数生成器Ⅱ
  2. JavaScript多线程 html5 Worker, SharedWorker
  3. java并发编程(二)synchronized
  4. 软件工程——HelloWorld
  5. Scala学习笔记(二)表达式和函数
  6. MySql表名的大小写问题
  7. C#的Access数据库的连接类
  8. SQLServer如何取得随机获取的数据库记录
  9. POJ 3984 迷宫问题 (Dijkstra)
  10. [Architecture Pattern] Entity Expansion