算法与程序设计递归算法理解——汉诺塔
目录
1.理解汉诺塔问题可以先从下面两点入手
2.列出一到四层汉诺塔移动顺序寻找规律
3.将移动顺序用树状图来表示
4.将树状图转化为程序实现
1.理解汉诺塔问题可以先从下面两点入手
- 根据汉诺塔移动规则,移动汉诺塔上层时可视下层为不存在
- 三个柱子等价
2.列出一到四层汉诺塔移动顺序寻找规律
图2.1汉诺塔模型
一层汉诺塔:A->C
二层汉诺塔:A->B,A->C,B->C
三层汉诺塔;A->C,A->B,C->B,A->C,B->A,B->C,A->C
四层汉诺塔:
A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C
处理一下变为:
一层汉诺塔:A->C
二层汉诺塔:A->B,(A->C),B->C
三层汉诺塔;A->C,(A->B),C->B,|(A->C)|,B->A,(B->C),A->C
四层汉诺塔:
A>B,(A->C),B->C,|(A->B)|,C->A,(C->B),A->B,|(A->C)|,B->C,(B->A),C->A,|(B->C)|,
A->B,(A->C),B->C
我们可以发现n层汉诺塔括号内的移动是n-1层汉诺塔的移动中出现的;且若以|作为分隔,若将移动看为一个向量,不难得到新出现的移动为已出现移动的向量展开.
如:二层时+=
3.将移动顺序用树状图来表示
图3.1两层汉诺塔移动
图3.2三层汉诺塔的移动
图3.3四层汉诺塔的移动
根据图3.3分析,处于底部的移动为较小圆盘的移动,从底部到顶部圆盘大小逐渐变大,层数为四层(若将最底层整层移走,图将变为三层汉诺塔的移动树状图。如图3.2所示)
从一层到四层移动树状图,树状图以向量展开的形式向下延展,与之相对应的是逐渐给A柱上向上增加小圆盘,所以n层汉诺塔的移动可简化为n-1层汉诺塔的移动,最终简化为2层汉诺塔移动的实现(上层移动可视下层不存在)。
以向量展开中心作为对称轴切树状图为左右两部分,走有两部分的移动具有等价性(三个柱子等价)若以图3.2为例,以A->C为中心切为左右两部分,左部分实现目标为将2层汉诺塔从A移至B,右部分实现目标为将处于B的两层汉诺塔移至C(此时第三层已经移至C)A,B,C三柱等价,左右部分可以看做是交换了柱子的名字,而移动方式是毫无区别的。如此分隔可运用到各层的向量展开中心对上层汉诺塔移动进行理解
4.将树状图转化为程序实现
我们可以发现,这种延展方式可以用递归的形式进行实现,如下为三层汉诺塔实现的树状图(可由输入层数来控制递归深度,此时为层数输入为3)
图4.1三层汉诺塔递归实现思路
c++实现
#include <iostream>
using namespace std;
int Hanoi(int n,char a,char b,char c)
{if(n==0)return 0;Hanoi(n-1,a,c,b);cout<<a<<"->"<<c<<endl;Hanoi(n-1,b,a,c);
}
int main()
{int num;cin>>num;Hanoi(num,'A','B','C');return 0;
}
Python实现
def hanoi(n, a, b, c):if n == 1:print(a, '-->', c)else:hanoi(n - 1, a, c, b)print(a, '-->', c)hanoi(n - 1, b, a, c)
# 调用
hanoi(5, 'A', 'B', 'C')
注:这种分析方式只适用于初学时理解递归如何进行上,对于使用递归时不宜以此方式进行思考
算法与程序设计递归算法理解——汉诺塔相关推荐
- 算法分析:傻瓜式理解汉诺塔递归问题
算法分析:傻瓜式理解汉诺塔递归问题 一.汉诺塔问题规则 设a.b.c是三个塔座, 开始时,a上有n个圆盘自下而上,从大到小地叠放在一起. 现要求将a上的圆盘移到b上,仍按相同顺序叠放 规则1:每次只能 ...
- 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式
目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 递归问题可谓是学习C语言以来的第一个拦路虎,而汉诺塔问题更是递归中对新手很不友好的一道经典题,我们接下来从公式角 ...
- 轻松理解汉诺塔问题(图解java描述)
引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...
- 基于非递归算法的汉诺塔游戏之Python实现
本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解.感谢国防科技大学刘万伟老师提供算法 ...
- python汉诺塔算法解析,python实现的汉诺塔算法示例
本文实例讲述了python实现的汉诺塔算法.分享给大家供大家参考,具体如下: 规则: 圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定 在小圆盘上不能放大圆盘 在三根柱子之间一次只能移动一个圆 ...
- 数据结构之递归算法解决汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- 递归算法 —— Hanoi汉诺塔游戏
前言 博客主页:干脆面la的主页 gitte链接:干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久.博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问 ...
- 递归算法之汉诺塔问题
问题叙述 故事背景: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上 ...
- 汉诺塔递归的空间复杂度_学习算法绕不开的~~汉诺塔
大家好,我是老郝.本文就汉诺塔问题向大家阐述递归的思想. [问题描述] 有三根柱子,最左边的柱子上从大到小放着很多的圆盘,要求把圆盘一个一个的放到最右边的柱子上并且只能小盘子压在大盘子上.(据说古代阿 ...
最新文章
- 通俗易懂讲解JavaScript深拷贝和浅拷贝
- archlinux包管理器--pacman常用命令
- linux centos7 安装最新版git 教程
- GDCM:gdcm::PDBHeader的测试程序
- Oracle具有开放性吗,Oracle数据库的特点与工作原理
- Invocation failed Unexpected end of file from server java.lang.RuntimeException: Invocation failed U
- [react] react16的reconciliation和commit分别是什么?
- 微信封杀lol手游活动小程序?《英雄联盟手游》回应了
- HowNet文件介绍
- Ubuntu下snap挂代理下载加速方法
- 如何设置电脑桌面动态壁纸
- 《Robust Consistent Video Depth Estimation》论文笔记
- 罗马帝国 Ancient Rome 简易修改器
- 原生js实现table 横向纵向全选功能
- 为企业微信“服务商应用”更改微信插件中的消息弹出样式
- 二极管结电容和反向恢复时间都是怎么来的
- 深入浅出的图神经网络,神经调节的知识网络图
- 讲讲自己一天入门Python的一些心得
- 云服务器可以用来做什么?云服务器有什么用途?
- 西安计算机软件行业薪水,西安今夏求职平均薪酬为每月8295元 这两个行业竞争最激烈...
热门文章
- ik php分词,ik中英文混合分词器
- css背景 背景颜色 颜色渐变
- 20 Linux Server Hardening Security Tips
- 【C++】Complex复数类运算符重载(类的成员函数实现)
- 部署hrm系统-Docker基础环境安装
- android修改猎豹浏览器,猎豹Android浏览器设计或编码缺陷导致远程拒绝服务漏洞 | wooyun-2015-0121433| WooYun.org...
- 华为让爱成双活动,缤纷好礼回馈消费者
- 如何对matlab的scope图编辑
- net-java-php-python-班级管理系统计算机毕业设计程序
- python怎么算积分_python求积分