游戏规则

已知条件 存在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');
}

汉诺塔代码图文详解(递归入门)相关推荐

  1. 递归经典例题 --- 汉诺塔(图文详解)

    目录 一.介绍 二.游戏规则 三.玩法简介 四.算法分析 五.代码解析 六.源码 七.递归过程详解 一.介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵 ...

  2. C语言汉诺塔问题图文详解

    设立三根柱子,pos1,pos2,pos3 要求将pos1柱子上的三个圆盘按照顺序移动到pos3柱子上,并且每次只能移动一个圆盘,移动过程中每个柱子上的圆盘都保持下大上小的顺序排列 当只有一个圆盘时, ...

  3. java汉诺塔(含汉诺塔问题的详解)

    目录 一:汉诺塔问题 二:汉诺塔问题思路 三:图示化思路 四:代码展示 一:汉诺塔问题 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的 ...

  4. 汉诺塔问题 Java详解

    作为一个Java初学者,看韩顺平老师的递归那一段,提到了汉诺塔的问题,但是大家普遍感到困惑,尤其是韩老师讲到的"借助"这个词,让不少同学感到无法理解. 实际上,借助在三行移动的代码 ...

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

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

  6. 汉诺塔代码执行的流程图

    汉诺塔是递归中的经典问题,很多人虽然懂得如何写汉诺塔的代码,但是并不能够完整地明白汉诺塔代码的调用逻辑.作者花了点时间,画了一张流程图,希望能够帮大家理解. 先上代码: #include"s ...

  7. 汉诺塔求次数(用递归)

    Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称:汉诺塔求次数(用递归) *作者:杨飞 *完成日期:2013年11月25日 *版本号:v ...

  8. 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

    摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络.首先介绍了基于GoogleNet.ResNet进 ...

  9. Unity 分享 功能 用Unity Native Share Plugin 实现链接、图片、视频等文件的分享+ 安卓 Ios 都可以,代码图文详解

    Unity 分享 功能 用Unity Native Share Plugin 实现链接.图片.视频等文件的分享+ 安卓 Ios 都可以,代码图文详解 前言 环境 效果 一.Unity Native S ...

最新文章

  1. stackoverflow_StackOverflow帐户如何确保您在公认的开发人员表格中占有一席之地
  2. 【Network Security!】xrdp+vnc4server+xfce4远程管理Ubuntu服务器桌面
  3. 深入理解分布式技术 - 负载均衡策略
  4. 天气模式_江西现罕见持续阴雨寡照天气 市民开启“花式吐槽”模式
  5. 坑爹的SQL ISNUMERIC
  6. AtCoder Regular Contest 058
  7. JAVA 技术类分享(一)
  8. ASP.NET页面与IIS底层交互和工作原理详解 (二)
  9. Eclipse3.2安装简介
  10. python基础训练100题(带答案)
  11. 编译原理(第3版)——引论
  12. 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
  13. 我的2012北京LAMP兄弟连
  14. linux 安装pureftp
  15. Unity XLua学习笔记(四):Hotfix热补丁
  16. vue用mand-mobile ui做交易所移动版实战示例
  17. php+条形码在线怎么生成,[条形码生成器]php实现在线生成条形码例子分享
  18. 分位数Granger因果检验实现原理
  19. Android 学习论坛博客及网站推荐
  20. 如何将Chrome设置为默认浏览器

热门文章

  1. 09驾校科目一考试系统——提交分数
  2. 大脑布罗德曼分区系统简介
  3. 【KMP】ZOJ-3587-Marlon's String
  4. 利用requests库获取cookie的两种方式
  5. 为什么靠谱的老板,不会要求员工忠诚?
  6. Revit出图翻模【局部三维功能】,三维视图从此不卡
  7. Java使用Spire.Pdf实现PDF添加图片水印
  8. skywalking plugin 开发初探 ONS plugin 实践
  9. html fmt转换日期格式,JSP JSTL fmt:parseDate标签:转换为时间
  10. 这里是Python爬虫的起点,抢占资源啦(Python学习教程)