C语言:汉诺塔(经典递归问题)
汉诺塔问题介绍
关于汉诺塔的传说:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
汉诺塔游戏规则:
现有三根相邻的柱子,标号为A,B,C。其中A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
现在要求把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
游戏图片:
游戏演示
一层汉诺塔
两层汉诺塔
三层汉诺塔
C语言递归解决汉诺塔问题
从刚刚的例子来看,其实汉诺塔还蛮简单的吧? 但是这只是前三层的解法,如果是四层,五层,甚至是100层呢?
好像我们顺着推下去并不能很顺利地解决问题。。。
所以我们提出用递归的方式来解决汉诺塔。
递归思想的介绍
程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式:把大事化小
递归的两个必要条件:
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
注意最后的两句话:把大事化小和递归的条件
递归思想的实现
让我们想一想,100层的汉诺塔,我们肯定是不容易解决的,那我们不妨大事化小,两层的汉诺塔我们可以解决吧?一层的汉诺塔我们可以解决吧?
那我们试着这样想:将除了最后一层的所有方块看成一块,然后借助C柱,将他们转移到B柱,这样是不是就可以把A柱上的最大的那一块转移到C柱上了?最后我们再将B柱上剩下的方块,借助A柱,转移到C柱上,这样就全部搞定了!
即N个盘子的解法:
1.将N-1个方块从A柱借助C杆转移到B柱
2.将A柱上的第N个方块转移到C柱
3.将N-1个方块从B柱借助A柱转移到C柱
图解:
C语言伪代码实现
最终C语言代码
#include <stdio.h>//统计移动次数
int count = 0;void hanoi(int n, char a, char b, char c)
{if (n == 1){printf("move:%c->%c\n", a, c);count++;}else{hanoi(n - 1, a, c, b);printf("move:%c->%c\n", a, c);count++;hanoi(n - 1, b, a, c);}
}
int main()
{int n = 0;scanf("%d", &n);hanoi(n, 'A', 'B', 'C');printf("最终移动次数:%d", count);
}
程序运行结果:
我们可以对照一下上面的GIF图片看看,最后结果应该是一样的。
跟着流程一起过一遍!
最后总结
汉诺塔是一道很经典的递归问题,掌握它能够让我们对递归有更深的体会。如果大家没有看明白的话,可以在编译器中逐步调试,通过监视栈的调用来好好体会一下。
没有拖更哈,这一期还是花费了不少力气的,如果哪里有误的地方还是希望大家指正,一起讨论,一起进步!
下一期的预告:C语言实现三子棋游戏,可以改成五子棋哦,有很详细的判断胜负的方法!
感谢观看,我们下一期再见!
C语言:汉诺塔(经典递归问题)相关推荐
- 汉诺塔——经典递归问题(c语言实现)
汉诺塔--经典递归问题(c语言实现) 问题背景 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下 ...
- 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...
- c语言汉诺塔实验报告,C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那 ...
- 汉诺塔问题 [递归 + 抽象]
汉诺塔 前言 一.题意 二.抽象思维 1.源码 三.扩展 1.分析 2.源码 总结 参考文献 前言 汉诺塔问题,是学习递归的第一个算法题,也是非常经典的递归问题.由于它是双递归问题,所以初学时不易理解 ...
- 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)
递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...
- 汉诺塔的递归逐步详解
文章目录 汉诺塔介绍 递归代码实现 以三个盘子为例逐步详解 汉诺塔介绍 如上图,有三根柱子A,B,C,在A柱子上有N个盘子(图上只画了三个),利用这三根柱子和N个盘子进行汉诺塔游戏,需要最终将A柱子上 ...
- python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...
汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...
- c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
问题概述:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个老和尚想把64个盘子从A座移动到C座,但是规定每次只允许移动一个盘,且在移动过程中在 ...
- 使用C语言实现汉诺塔问题——递归
汉诺塔问题: 汉诺塔问题,是心理学实验研究中常用的任务之一.该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A.辅助柱B及目标柱C. 1.来源: 相传在古印度圣庙 ...
- [C语言]汉诺塔|递归
问题:一共三根柱子,在一根柱子上从下往上按照大小顺序摞着n片圆盘,把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.(将A中圆盘全部移 ...
最新文章
- DotNetCore跨平台~System.DrawingCore部署Linux需要注意的
- 几个流行移动前端框架的比较评分
- CVPR2020---30篇最新论文下载!
- swift 学习笔记之在柯里化(Currying)
- 【OpenCV3】cv::Mat中的数据按行列写入txt文件中
- 特稿 | OceanBase 连破纪录:蚂蚁技术人的砥砺前行
- spring 事务持久性_项目学生:Spring数据的持久性
- C语言 数组排序 – 选择法排序 - C语言零基础入门教程
- 2019物联网发展十大预测,你准备好了吗?
- 如何用DAX实现查看每个月中不同类别排名前一位,以及一个简单的svg案例
- html页面搜索文章标题,html-文章页面中的H1-网站标题还是文章标题?
- java刷票小程序,小程序投票系统刷票
- Builder模式和工厂模式的区别
- vue 点击a链接 实现url下载文件
- DTCMS添加栏目教程
- 2021年最佳Selenium替代品
- Object.defineProperty是Es5中无法shim的特性 shim是什么?
- 网站访问流程及原理分析
- 电容式液晶屏可实现多点触控
- UDP sendto频率过快导致发送丢包