汉诺塔代码图文详解(递归入门)
游戏规则:
已知条件 | 存在A,B,C三根柱子,A上套有N片圆盘 (如下图) |
---|---|
目的 | 将A上的所有圆盘移到C上 |
约束条件 | 每次只能移动一片圆盘,且整个过程中只能出现小圆盘在大圆盘之上的情况 |
首先我们模拟(N=2,3,4).
这是两层汉诺塔的移动步骤.
这是三层汉诺塔的步骤.
这是四层的汉诺塔步骤.
移动规律:做完模拟之后可以很自然地发现,要把N层的汉诺塔从A柱移至C柱,首先是要把上面(N-1)片圆盘全部拿掉(也就是移至B处),然后才能把 第 N片圆盘移至C柱.
当我们成功地把第N片圆盘移至C柱时,问题转化成了要把B柱上的(N-1)片圆盘移至C处.然后重复上述操作:把(N-2)片圆盘全部移至A柱,再把 第 (N-1)片圆盘移至C柱…
思路分析:从移动规律上看,我们是把要移动的n片圆盘分成两个整体:(n-1)片和第n片,那么这两个整体可以看作是N=2的汉诺塔问题的部分解.
关于移动次数的分析:观察上述过程图,发现中间部分的关于"n-1"层的移动实际上是不进行的,它其实是我们分析问题的中间假象项,它由下一层递归去实现,而下一层的"n-1"层的移动又是由下一层递归去实现,最后递归到"n-1"=1时,这一次的"n-1"项才真正开始移动.那么,每下一次递归的关于"n-1"层的移动项是这一次关于"n-1"的移动项的2倍.所以当n-1次递归后,最后会造就 2^(n-1) ①次数的"n-1"=1的移动…
而关于第n层移动的项每次递归都会执行一次.那么关于第n层移动的次数是20 + 21 +22 +23 +…+ 2n-2 ②;
综合①②得Sn=20 + 21 +22 +23 +…+ 2n-2+2n-1 ;
Sn是关于a1=1,an=2n-1的等比数列.
计算得Sn=2n -1
[结合上述内容其实不难发现,我们可以用递归的思想去实现代码]
如果还不是很清楚,我们不妨先打下代码的大致框架,随后逐步完善。。。
//代码框架
#include<stdio.h>
void Move()
{}
void HannuoTower()
{}
int main()
{int N;scanf("%d",&N);HannuoTower();
}
由模拟(N=2,3,4)的过程图得知,HannuoTower函数分为三个步骤:
(A柱B柱C柱视不同情况而分为:圆盘当前所在位置,要移动的目标位置,临时存放的第三位置)
1.先移动(n-1)片圆盘到第三位置 //(无法一次性实现)这个步骤的实现用递归
2.再移动 第 n片圆盘到目标位置 //Move函数直接移动输出
3.最后移动(n-1)片圆盘到 第 n片圆盘之上(也就是目标位置) //实现方法同步骤1.
于是乎,HannuoTower函数和Move可以写成如下形式
void Move(char a,char c)
{printf("%c -> %c",a,c);
}
void HannuoTower(void n,char a,char b,char c)//n为层数
//固定地将形参a视为当前位置,形参b视为临时位置,形参c视为目标位置.
{HannuoTower(n-1,a,c,b); //较下一次情况,临时位置和目标位置的身份互换Move(a,c);//输出 当前位置移至目标位置的信息HannuoTower(n-1,b,a,c);//较下一次情况,当前位置和临时位置的身份互换
}
这里要注意一点的是,此时的HannuoTower函数是无法作用的,当n减到1时,它还是会递归下去.递归函数最重要的是设置出口,这里我们可以用if语句去判断跳出的条件(n==1).
此外,为了方便观察汉诺塔游戏的过程和研究圆盘移动次数的计算规律.我们可以另加一个全局变量count,用来计数移动的次数.
补充完整的代码如下.
#include<stdio.h>
int count=1;
void Move(char a,char c)
{printf("第%d次,%c -> %c\n",count,a,c);count++;
}
void HannuoTower(int n,char a,char b,char c)
{if(n==1)Move(a,c);else{HannuoTower(n-1,a,c,b);Move(a,c);HannuoTower(n-1,b,a,c);}
}
int main()
{int n;scanf("%d",&n);HannuoTower(n,'A','B','C');
}
汉诺塔代码图文详解(递归入门)相关推荐
- 递归经典例题 --- 汉诺塔(图文详解)
目录 一.介绍 二.游戏规则 三.玩法简介 四.算法分析 五.代码解析 六.源码 七.递归过程详解 一.介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵 ...
- C语言汉诺塔问题图文详解
设立三根柱子,pos1,pos2,pos3 要求将pos1柱子上的三个圆盘按照顺序移动到pos3柱子上,并且每次只能移动一个圆盘,移动过程中每个柱子上的圆盘都保持下大上小的顺序排列 当只有一个圆盘时, ...
- java汉诺塔(含汉诺塔问题的详解)
目录 一:汉诺塔问题 二:汉诺塔问题思路 三:图示化思路 四:代码展示 一:汉诺塔问题 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的 ...
- 汉诺塔问题 Java详解
作为一个Java初学者,看韩顺平老师的递归那一段,提到了汉诺塔的问题,但是大家普遍感到困惑,尤其是韩老师讲到的"借助"这个词,让不少同学感到无法理解. 实际上,借助在三行移动的代码 ...
- 汉诺塔python创新设计_递归经典案例汉诺塔 python实现
最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...
- 汉诺塔代码执行的流程图
汉诺塔是递归中的经典问题,很多人虽然懂得如何写汉诺塔的代码,但是并不能够完整地明白汉诺塔代码的调用逻辑.作者花了点时间,画了一张流程图,希望能够帮大家理解. 先上代码: #include"s ...
- 汉诺塔求次数(用递归)
Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称:汉诺塔求次数(用递归) *作者:杨飞 *完成日期:2013年11月25日 *版本号:v ...
- 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)
摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络.首先介绍了基于GoogleNet.ResNet进 ...
- Unity 分享 功能 用Unity Native Share Plugin 实现链接、图片、视频等文件的分享+ 安卓 Ios 都可以,代码图文详解
Unity 分享 功能 用Unity Native Share Plugin 实现链接.图片.视频等文件的分享+ 安卓 Ios 都可以,代码图文详解 前言 环境 效果 一.Unity Native S ...
最新文章
- stackoverflow_StackOverflow帐户如何确保您在公认的开发人员表格中占有一席之地
- 【Network Security!】xrdp+vnc4server+xfce4远程管理Ubuntu服务器桌面
- 深入理解分布式技术 - 负载均衡策略
- 天气模式_江西现罕见持续阴雨寡照天气 市民开启“花式吐槽”模式
- 坑爹的SQL ISNUMERIC
- AtCoder Regular Contest 058
- JAVA 技术类分享(一)
- ASP.NET页面与IIS底层交互和工作原理详解 (二)
- Eclipse3.2安装简介
- python基础训练100题(带答案)
- 编译原理(第3版)——引论
- 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
- 我的2012北京LAMP兄弟连
- linux 安装pureftp
- Unity XLua学习笔记(四):Hotfix热补丁
- vue用mand-mobile ui做交易所移动版实战示例
- php+条形码在线怎么生成,[条形码生成器]php实现在线生成条形码例子分享
- 分位数Granger因果检验实现原理
- Android 学习论坛博客及网站推荐
- 如何将Chrome设置为默认浏览器