汉诺塔问题是一个递归的经典范例。

让我们先从移动一个盘开始,逐渐增加需要移动的盘数。
    当我们需要移动一个盘时,只需将该盘移动至C杆。

int c = 0;
void move(char a, char b)
{printf("第%d步为:%c->%c\n",++c, a, b);
}

当我们需要移动两个盘时,便需要在移动一个盘的基础上,再移动一个(此时这2个盘最终会移动到B杆,这个问题我们会在后面解决)。
    移动三个盘时,便要在移动两个盘的基础上再移动一个,继续增加下去,我们会发现:我们在需要移动n个盘时,只要在(n-1)个盘的基础上再移动一个盘。我们将这n个盘看成两部分,第n个盘,和前(n-1)个盘的整体。这样当n>=2时,都是同样的模型:先将上面的盘移动到B杆,再将最下面的盘移动到C杆,最后将B杆上的盘移到C杆,放在最下面的盘之上。

我们在需要移动n个盘时,已经成功移动了(n-1)个盘,我们只需将移动(n-1)个盘的过程写成一个函数。移动n个盘需要调用移动(n-1)个盘的函数,移动(n-1)个盘需要调用移动(n-2)个盘的函数......最终递推到移动2个盘会调用移动1个盘的函数,这便是函数的递归。

通过以上的思考逻辑,我们会发现:编写递归函数时,虽然程序是在最外层的函数层层调用至最内层,但我们的逻辑出发点还是要落在最内层的函数,也就是递归停止的那层函数。
  
    但是当我们尝试写出代码时,会发现出现了新的问题,那就是我们调用的移动(n-1)函数最终会将(n-1)个盘移动到C盘,这也就代表着第n个盘只能移动到B杆,所以最终这全部n个盘也会在B杆。探寻一下规律,我们会发现,移动到B杆和移动到C杆的现象是交替出现的。我们当然也可以通过单双数来区分,但这样不仅麻烦,而且低效。因为在代码中,杆不是实体,只能用符号储存在变量中来表示对应的杆。我们尝试将杆的位置看成储存杆的变量,而杆本身只是一个符号

我们在调用移动(n-1)的函数时,可以通过函数的形参进行“换杆”。我们只需要在调用函数时更换参数位置,便可以将形参中的值互换,实现“换杆”操作,保证无论移动多少个盘,最终都在C杆上。

void hanotower(int n, char a, char b, char c);hanotower(n - 1, a, c, b);//将(n-1)个盘整体移动,并将c杆与b杆交换位置

最后一步便是将b杆的(n-1)个盘整体移到C杆,放在第n个盘之上。相信在接受了以上的思想后,这一步也会自然的以这个思路思考。既然能将A杆到C杆修改为A杆到B杆,自然也能将其修改为B杆到C杆。依然只需要在调用函数时改变参数位置。

void hanotower(int n, char a, char b, char c);hanotower(n - 1, b, a, c);//将(n-1)个盘整体移动,并将a杆与b杆交换位置

全部代码为:

#include<stdio.h>
int c = 0;
void move(char a, char b)
{printf("第%d步为:%c->%c\n",++c, a, b);
}
void hanotower(int n, char a, char b, char c)
{if (n == 1)move(a, c);else{hanotower(n - 1, a, c, b);//将(n-1)个盘整体移动,并将c杆与b杆交换位置move(a, c);hanotower(n - 1, b, a, c);//将(n-1)个盘整体移动,并将a杆与b杆交换位置}
}
int main()
{int n = 0;scanf_s("%d", &n);hanotower(n, 'A', 'B', 'C');return 0;
}

通过这个例子,我们可以初步理解一些递归的思想,也能把握一些理解递归的方法:

1.由里到外,从递归终止的那层开始,理解每一层函数的作用

2.在使用时,知道每一层函数的作用就已经足够了,在编写时试图由外向内将代码一层层展开来理解反而容易感到困惑,影响使用的逻辑。

【算法篇】汉诺塔问题相关推荐

  1. 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)

    第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...

  2. 经典算法之汉诺塔求解问题

    法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64 ...

  3. 汉诺塔算法python_经典算法:汉诺塔

    学编程,学IT,算法也是必不可缺的,这一次给大家带来一个经典的递归算法题,汉诺塔.算是算法的入门小题目之一吧~ 视频教程 什么是汉诺塔? 我这里直接拉来一个图解释一下(挂了请联系我) 就是这么一个东西 ...

  4. 【算法】汉诺塔 移动

    文章目录 1.概述 本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 1.概述 汉诺塔的移动参考其他文章. 算法如下 public class Hanoi ...

  5. 程序设计与算法----递归汉诺塔问题

    汉诺塔 古代有一个梵塔,塔内有三个座A,B,C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移动到C座,但每次只能允许移动一个盘子,并且在移动的过程中 ...

  6. 算法笔记 —— 汉诺塔详解

    文章目录 一.问题来源 二.小游戏体验 三.思路分析 四. 程序实现 一.问题来源 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号X.Y.Z),在 ...

  7. python算法设计 - 汉诺塔

    python算法设计源码:https://github.com/MakerChen66/Python3Algorithm 版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.汉诺塔 二.源码 ...

  8. 分治算法求解汉诺塔问题

    1.什么是分治算法? 分治算法,字面理解"分而治之",就是把一个复杂的问题分成两个或者更多的相同或者相似的子问题,再把子问题分成更小的子问题...直到最后子问题可以直接简单求解,原 ...

  9. 汉诺塔算法 java_汉诺塔算法java实现详解

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  10. 用java编写汉诺塔问题_数据结构与算法之汉诺塔问题(Java递归)

    汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 要求:1)大的盘在下面,小的盘在上面 2)一次只能移动一个盘子 个人思路:先 ...

最新文章

  1. linux 双网卡浮动ip,Linux 双网卡绑定一个IP原理及实现
  2. android 从零单排 第一期 按键显示helloworld
  3. 趁webpack5还没出,先升级成webpack4吧
  4. C函数实现返回多个值的方法
  5. 柔和渐变UI素材,让设计更加柔和的法宝。
  6. DISC免费性格测试题
  7. Linux zlog日志打印
  8. matlab 变分法,模糊数学+变分法+Matlab基础教程
  9. 机器学习第九章聚类Kmeans练习(西瓜数据集4.0)
  10. negative和passive的反义词_消极的近义词和反义词
  11. 七年级下册政治知识点总结
  12. 吴恩达老师深度学习课程完整笔记
  13. 我要你觉得,我不要我觉得--根据企业现状实施DevOps
  14. 2019牛客暑期多校9H:Cutting Bamboos【主席树+二分】
  15. 【开源OA项目】基于环信IM开发完整的企业通讯解决方案-Dolores
  16. java 数据写入txt乱码_java写入文件是乱码
  17. centos 释放swap_CentOS下SWAP分区建立及释放内存详解
  18. 易语言制作计算软件简单步骤_【软件工具】快速制作动画式微课,就是这么简单...
  19. 一名年薪30W+的Java程序员讲解:想去大公司,前三年要懂些什么?
  20. 第六届山东省大学生网络安全技能大赛决赛Writeup

热门文章

  1. Rayleigh-Ritz法和Galerkin法
  2. qc中的流程图怎么画_QC常用手法_流程图详解.ppt
  3. DM使用过程中几个常见的问题
  4. ffmpeg 截图太模糊了_通过ffmpeg实现视频流截图
  5. [系统安全] 十五.Chrome密码保存功能渗透解析、Chrome蓝屏漏洞及音乐软件漏洞复现
  6. 3ds Max 2014破解版安装中遇到的问题及解决
  7. Wonderware-InTouch用脚本实现*邮件*发送功能
  8. matlab液压仿真模型,基于MATLABsimulink的液压系统动态仿真.ppt
  9. django和php学哪个好,哪个更适合我的项目:Django、Plone、php还是rubyonrails
  10. weblogic启动项目失败查看_weblogic 部署项目成功,但是再界面上取不到数据