目录

1.递归思想简介

2.汉诺塔问题

3.汉诺塔递归的c语言实现


1.递归思想简介

在c语言中,程序调用自身的编程技巧称为递归( recursion)。

递归的定义看上去似乎很抽象,使用代码描述能够让人容易理解,下面是一个函数递归的例子。

/*                                递归求n的阶乘                        */int factorial(int n)  //定义一个求阶乘的函数叫做factorial(),需要一个整形参数,返回一个整形值
{if (n <= 1)       //递归结束的条件{return 1;}else{return n * factorial(n - 1);//在factorial()中再次调用自身,只不过参数由n变成n-1}
}

在这个例子中,函数 factorial()接收到一个整形数n,如n=5,暂时称作F(5),这时n!=F(5),而函数的功能如下:

  1. 判断5是否小于或等于1,如果是,将1返回;不是,进到else执行语句
  2. 返回(这里可以将return看作等于)5× factorial(n - 1),等价于 F(5)=5×F(4)
  3. 用上面的方法计算F(4)=4×F(3)
  4. ....以此类推直到达到限制条件n=1时有,F(1)=1

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题。

由于每个小问题处理起来都有与大问题类似的行为逻辑,因此我们可以“大事化小”,而递归说白了,就是不断地在套娃。

但是,计算机的内存是有限的,由于每次调用函数都需要在栈区开辟一个空间,使得递归不能无限制地进行下去,没有递归结束的条件,当操作系统为进程分配的虚拟地址空间当中的栈空间被耗尽时,会发生堆栈溢出,产生段错误(segmentation fault)。

因此,使用递归时应注意:

  • 必须存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件

递归的好处在于:

  • 代码简洁
  • 在某些特定问题上求解方便

递归的缺点在于

  • 消耗大量时间和空间资源——效率较低
  • 可能伴随许多重复计算,工作量大——影响性能

2.汉诺塔问题

以下内容来自维基百科

最早发明这个问题的人是法国数学家爱德华·卢卡斯。

传说越南河内某间寺院有三根银棒,上串 64 个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。

若传说属实,僧侣们需要步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要 5849 亿年才能完成。整个宇宙现在也不过 137 亿年。

这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定

汉诺塔基本的玩法如图,其规则是:将圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

当圆盘数量只有3个的时候,求解的方法显而易见,但当数量增多时,问题变得有些棘手起来。但不管怎么移动,核心思想都是递归:

  1. 先从n块圆盘中将最大的一块移动到最后的柱子上
  2. 接着从剩下n-1找到最大的一块移到柱子上
  3. ......

3.汉诺塔递归的c语言实现

C语言代码如下:

/*                            汉诺塔问题(递归实现)                     */#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>void move(char, char); // 声明一个函数move,函数定义在下方,用于表示圆盘的交换void Towers_Of_Hanoi(int n,char a,char b,char c)
{if (1 == n)                        //递归结束标志:当柱子上只有一块圆盘{move(a, c);                    //从a移动到c}elseTowers_Of_Hanoi(n - 1, a, c, b);    //将最上面n-1个圆盘移动到b柱上move(a, c);                         //将a上面最后一块圆盘移动到c柱上Towers_Of_Hanoi(n - 1, b, a, c);    //将b柱上n-1个圆盘移动到a柱上}
}void move(char x, char y)
{printf("%c-->%c\n", x, y);
}int main()
{int n = 0;scanf("%d", &n);Towers_Of_Hanoi(n, 'A', 'B', 'C');//n为A柱子上圆盘的数量,A,B,C代表三根柱子return 0;
}

程序运行结果为:

​​​​

C语言递归思想实现汉诺塔相关推荐

  1. 基于C语言和递归思想实现汉诺塔

    汉诺塔是源于印度一个古老传说的益智玩具. 传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...

  2. C语言递归小游戏—汉诺塔(hanoi)

    前言: 汉诺塔大家都不陌生吧,在猩球崛起这个电影里,人们通过凯撒玩汉诺塔知道了它的智商增高了,这个益智小游戏的规则就是: 汉诺塔(Tower of Hanoi),又称河内塔.是一个源于印度古老传说的益 ...

  3. C语言---移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤

    C语言-移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤 在学习递归的过程中,Hanoi(汉诺)塔问题是避开不了的,很多新手在这儿一脸懵. 我们先简单介绍一些Hanoi(汉诺)塔问题到底是个 ...

  4. 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。

    目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...

  5. 递归(二)-------经典递归实例(汉诺塔问题)

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章讨论一个经典的递归实例(Fibonacy数列问题),现在来讨论一下另外一个经典的递归例子:汉诺塔问题: 问题描述:在 ...

  6. 个盘子的汉诺塔需要移动几步_坨——理解递归实现quot;汉诺塔quot;代码的关键...

    我记得,大学学C语言时,在函数递归调用那一节有个作业,就是写汉诺塔.不少同学遭遇到困难.在知乎上遇见的就有: 如何理解汉诺塔的递归?​www.zhihu.com 题主发出悲鸣:"--学C++ ...

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

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

  8. 堆栈思想案例—汉诺塔问题求解最小步数

    文章目录 前言 一.何为汉诺塔 二.问题分析 三.算法实现 前言 汉诺塔是一款有趣的智力游戏,其求解问题在数据结构与算法中也是堆栈思想和递归思想的典型案例. 一.何为汉诺塔 如图所示:有A.B.C三个 ...

  9. 数学归纳法+递归问题之汉诺塔问题

    数学归纳法: 数学归纳法有好几种形式,我们这里采用最常见的一种.其他形式,详见. PS:有时候维基百科+百度百科,对比的看,效果更好.维基更细,但百度百科可以帮助我们总结,例子也更中国思维,更容易理解 ...

最新文章

  1. Matlab与线性代数 -- 全1矩阵
  2. 操作系统课设--具有优先级的线程调度
  3. 导航栏iframe公共样式_中秋节微信公众号推文样式素材推荐
  4. 微信小程序直播助力深圳线上购物节 数百场品牌小程序开播
  5. ❤️DDOS攻击详解❤️——万物互联时代的巨大威胁!安全领域最棘手的问题之一
  6. python tkinter获取屏幕大小_用 Python 制作关不掉的端午安康弹窗
  7. 插件对计算机的运行有什么影响吗,电脑插件太多导致电脑运行缓慢怎么办 - 驱动管家...
  8. PLC梯形图编程基础知识详解(转自:http://gongkong.ofweek.com/2014-09/ART-310012-11000-28882866_2.html)
  9. 52单片机C语言如何用间接寻址,单片机要如何寻址?
  10. 大数据分析师岗位是青春饭
  11. 计算机ms高级应用科目一 科目二考什么,科目一、科目二、科目三、科目四都考什么?全都在这儿了!...
  12. android编译成功闪退,编译调试-android-app闪退定位
  13. Greenplum查看表/库大小、进程、表膨胀处理(sql语句)
  14. web 页面的提交方式
  15. 弹指流连间,在梦中轻拾爱的碎片
  16. Data Binding的报错集合 例如Error 10 54 错误 程序包com kodulf recycl
  17. 基于数据结构知识解决学校超市选址问题
  18. HTTP状态码206和416
  19. LoRa网关和NS的那些事
  20. 西门子S7-1200PLC双轴定位算法电池焊接控制博图程序案例,触摸屏画面采用威纶触摸屏

热门文章

  1. 渗透测试之XSS脚本
  2. 1997年到2017年各省碳排放数
  3. labelme 语义分割数据集_labelme自定义语义分割数据集 Python文件调用labelme_json_to_da...
  4. 负数的二进制表示方法
  5. 语音合成论文优选:音素韵律控制Prosodic Clustering for Phoneme-level Prosody Control in End-to-End Speech Synthesis
  6. 对话库克:商业具有周期性
  7. Day902.Memory存储引擎 -MySQL实战
  8. 阿里云ECS测评之选购指南
  9. 如何部署Docker?Docker安装详细教程
  10. 爬虫(17)多线程练习 图片爬取案例