汉诺塔问题的详解-附代码

一、由来:

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔问题源于递归算法,看起来很简单,想起来很麻烦,要深刻理解递归的真正含义,将第一个柱子上的所有圆盘全部拿到第三个盘子上,其实这些盘子可以抽象的分成两个部分,最底下的大盘子,和上面的小盘子.

所有盘子从柱子A移动到柱子B上

(1)当N=1 时,只有一个盘子,只需要移动一次:A—>1—>B;
(2)当N=2时,则需要移动三次:
        A—>1—> C

A —>2—>B

C —>1—>B
(3)如果N=3,则具体移动步骤为:

A—>1—> B,    A —>2—>C,    B —>1—>C.       (3.1)

A—>3—>B.                                                         (3.2)

C—>1—>A,    C —>2—>B,    A —>1—>B.         (3.3)

就来三个盘子来看,先把最小的盘子放在第三个柱子上,再把第二个盘子放在地二个柱子上,然后把最小的那个放在第二个上,最底部的现在可以拿到第三个柱子上了,紧接着把第二个柱子上最小的盘子放在第一个柱子上,第二小的盘子放在第三个柱子上的最底部盘子的上面,再把最小的放在第三个柱子上面,我们将

三个柱子命名‘A‘,‘B‘,‘C‘;我们是想办法借助‘C‘柱子,将最底部上面的所有盘子放在‘B‘上,再将这些盘子借助‘C‘柱子放在‘A‘柱子上,这样完成的汉诺塔,以下是代码演示:

void han(char A,char  B,char C,int n){
        if(n<=1){
                  printf("%c->%c",A,C);
                   return;
                   }
         han(A,C,B,n-1);
         printf("%c->%c",A,C);
         han(B,C,A,n-1);  

}             

如果有想法和疑问欢迎在下方留言~

原文地址:https://www.cnblogs.com/julyzqy/p/11730192.html

时间: 2024-11-05 16:07:46

汉诺塔问题的详解-附代码的相关文章

python中汉诺塔的递归算法详解

请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如: def move(n, a, b, c): pass 答案: def move(n,a,b,c): if n==1: print(a,'->',c) else: move(n-1,a,c,b) move(1,a,b,c) move(n-1,b,a,c) 理解的关键不需要管每一步是怎么解决的.重点是实现你的目的.我们可以这么理解: move

Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档

前言 基本环境 Django版本:1.11.8 Python版本:3.6 OS: win10 x64 本文摘要 提供了常用的Django内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. 本文完整项目文件代码下载地址:完整示例 Django完整内置过滤器帮助文档:Django内置过滤器完整版 参考文献:Django 中文文档 1.8 内置过滤器 注意:所有带参数的过滤器,在使用时,冒号:和参数中间不能有空格. add加 功能: 把add后的参数num加给value: 数字相加会进行算

MyBatis入门详解——附代码

我现在在学ssm框架,今天为大家分享一下MyBatis框架. 一, MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录. 二,现在写一个简单的例子 1)先建立Javaweb

C语言之算法初步(汉诺塔--递归算法)

个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考.记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果.现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.所以算法看起来就简单多了.不过,思考过程还是很痛苦的,难以理解.递归中会保存数据的好处在这里又得到体现,太神奇了. 汉诺塔代码如下:

汉诺塔问题非递归算法集锦

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 汉诺塔问题介绍: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面.当所有的金片都从梵天穿好的那根针上移到另外一概针上时,世界就将在一声霹

递归求汉诺塔的解

递归求汉诺塔的解 // 递归求汉诺塔的解.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> #include<conio.h> #include<windows.h> void HanoiTower(int,char,char,char); void main() { int n; char A='A',B='B',C='C'; printf("---Hanoi To

JavaScript递归函数解“汉诺塔”

"汉诺塔"是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把交大的圆盘放置在较小的圆盘之上. 仔细解读这段话,如果有10个圆盘甚至更多,那操作步骤绝对多到让人震惊,但目标是把一堆圆盘移动到目标柱子上,如果把上面的9个圆盘看成一套,第10个圆盘看成另一套,先移动9个圆盘到另一根柱子上,再把上面8个圆盘看成一套,第9个圆盘看成另一套--依次类

Python算法 - 递归精解 - 汉诺塔问题

汉诺塔问题 题意 将A 柱子上的块转移到 C 上 条件1  -  每次只能转移一块 条件2  -  大块不能压小快 解析 概念原理 冰箱装大象问题 : 1. 打开冰箱 2. 放入大象 3. 关上冰箱 类比在 任何一个块 n 来说: 1. 把上面的块都移动好 2. n 块移动过去 3. 之前上面的块在放在 n 块上面 简化问题, 考虑 123块的移动, 可以考虑成我想移动 3 . 必然要移动12 同理 我想移动 2, 必然要移动 1 , 即关系为 f(3) ---> f(2) ---> f(1)

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,