递归是数据结构中一种常用的算法,在非线性结构中,有相当多的问题都是使用递归的方法来解决,递归也是一种“很好用”的方法。

那么什么是递归呢?

递归就是将一个复杂的问题化成若干个简单的小问题,通过解决若干个小问题,在解决这整个大问题。通过函数自我调用过程(一个函数中使用“另一个函数”,那个函数就是自己本身的函数)先解决小问题中的“小问题”然后在解决整个小问题,最后解决整个大问题。小编对递归的理解是,先将一个大问题分成若干的小问题,在依次将若干个小问题继续分解成更“小”的问题,找到一个不能分解的最“小”的问题,并解决,最后依次解决各种小问题,最后解决大问题,这就是递归的全过程。

上面的讲述可能不太理解,那我们通过有关例子来解决。我们以最经典的递归例题,斐波那契数列为例。就是兔子数列。以a1为数列的首元素,已知第n个元素是第n-1个元素和第n-2个元素之和,而第一个和第二个元素为1。那我们如何求出第n个元素呢?

按照我们上面的说法,将“求出第n个元素看成是一个复杂的大问题”,我们将这大问题分解成两个小问题,分别是求出an-1和an-2,求出第an-1和an-2之后,就可以求出an,那我们又如何求出an-1和an-2呢?同样,将这两个小问题分解成跟小的问题,直到找出“最小的问题”,而这个最小的问题就是求出a1和a2。代码实现如下:

#include <stdio.h>int ff(int n)           //我们要求求出第n个元素
{if(n==1||n==2)      //如果n为1或者n为2这返回值为1;return 1;else                //否则我们将问题分解,分解成两个小问题。调用自身函数来解决这些问题return ff(n-1)+ff(n-2);
}

一些刚接触c语言的新手可能不容易看懂,我们使用图片来解决

如图,如果n为5,将求出a5分成求出a4和a3两个小问题,再将求出a4分成求出a3和a2两个小问题,在将求出a3分成求出a1和a2两个小问题,由于a1和a2等于1,我们就可以解决求出a4这个小问题,同理,在解决求出a3这个小问题,我们就解决求出a5这个大问题。

那么递归的结构如何设计呢?

首先,递归的结构有两个最重要的因素,递归体和递归出口。递归体就是分解问题的部分,将大问题分解成两个小问题,而递归出口就是定义最“小”的问题,最后解决最小的问题。递归出口不等于整个递归的结束,而是整个递归体的结束,整个递归体结束后在依次解决一些小问题,最后解决大问题,就算整个递归结束。

我们重新换一个结构为例来讲解,以求n的阶层来讲解:

首先n的阶层的定义就是从1开始一直乘到n,(1*2*3*4.......*n)若我们要求出n的阶层,将这个大问题化成一个小问题,就是先算出n-1的阶层,而要算出n-1的阶层就要先算出n-2的阶层。依次递归。而递归出口就是n为1的时候。代码实现如下。

#include <stdio.h>int f1(int n)
{if(n==1)return 1;       //递归出口elsereturn n*f(n-1);//递归体
}

递归体相当于函数的自我调用过程,也是分解问题的过程。

递归在二叉树和一些算法中有着重要的应用,首先要理解递归,先要理解函数的自我调用。

这里留给大家几个问题:

1.递归有没有可能进入一个死循环

2.如何寻找递归出口和递归体

3.对于汉诺塔问题如何使用递归来解决。

递归的定义已经讲解完成,谢谢您的阅读。若有不足或者错误之处,欢迎在评论区指出,谢谢。

数据结构(递归及应用)相关推荐

  1. 数据结构---递归实现十进制装换为任意进制

    数据结构-递归实现十进制装换为任意进制 代码: #include <stdio.h> #include <stdlib.h> #include"stack.h&quo ...

  2. C++两个函数可以相互递归吗_通俗讲:数据结构递归思想

    通俗讲:数据结构递归思想 脑容量有限,拒绝花里胡哨 一个递归求阶乘的例子 #如5的阶乘 f(6)=6*5*4*3*2*1 def f(int n) {if n <= 0 : return 1re ...

  3. 数据结构 递归讲解

    1. 递归的定义 定义好简单了, 如果1个函数直接或间接地调用自己本身, 我们就说它是1个递归. 2. 不同函数是怎样互相调用的. 严蔚敏编写的的数据结构教材中写过这段话: 当1个函数(A)的运行期间 ...

  4. 数据结构 - 递归

    关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 递归介绍 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法 当边界条件不满足时,递归前进:当边界条件 ...

  5. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  6. 数据结构 - 递归 回溯算法(八皇后问题)

    游戏地址自己写完了可以根据结果去测试一下. 算法分析 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列.然后判断是否OK, 如果不OK,继续放在.第二列.第三列. ...

  7. python数据结构递归树_python数据结构(对称二叉树递归和迭代)

    1.题目描述 给定一个二叉树,检查它是否是镜像对称的. 2.代码详解 2.1 递归写法 # Definition for a binary tree node. class TreeNode(obje ...

  8. 二叉树的递归遍历算法c语言 数据结构,递归创建二叉树c语言实现+详细解释

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void CreatBiTree(BiTree T) { char a; scanf("%c",&a); if(a=='@') ...

  9. 数据结构 —— 递归和树

    概况: 递归和分治 递归中用到了分治法. 分治法的思想简单概括就是"分而治之". 递归实际使用"栈"来实现的. 递归包括递归方程.临界条件: EX:实现随机斐波 ...

  10. 数据结构::递归时间复杂度的计算

    开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治 ...

最新文章

  1. 干货|吴恩达Coursera课程教你学习神经网络!
  2. Python web开发——自定义userprofile(用户描述)
  3. Java加密与解密的艺术~Security
  4. 【C语言】一维数组排序(函数,数组和循环结构语句)
  5. c语言程序设计网络作业,北语网院17春《C语言程序设计》作业_2满分答案
  6. agilent3070软件安装
  7. 怎样在百度地图上画圈_知识地图分享:你不是记忆差,你只是没找对方法
  8. Linux安装Nginx1.7.4、php5.5.15和配置
  9. Crystal Report在.net中的两种显示方式
  10. 如何恢复丢失的分区及文件
  11. 关于获得淘宝商品评论的那些事
  12. 『 再看.NET7』看看required属性有什么不同
  13. Android面部动态识别(眼睛+嘴巴+鼻子轮廓标记)
  14. 叶君—国画大师笔下的“忠义千秋”
  15. IndentationError: unindent does not match any outer indentation level问题
  16. cisco 华三 对接_H3C 交换机与Cisco交换机采用链路聚合对接的配置案例
  17. 曼尼托巴大学计算机科学硕士,曼尼托巴大学电气和计算机工程硕士解析
  18. java 数学测试_Java实现小学数学练习
  19. VTK笔记——医学图像的切片提取(vtkImageReslice)
  20. 基于JSP的网络音乐KTV点歌电台网站

热门文章

  1. macOS Big Sur 11.2.3 (20D91) 正式版发布,百度网盘下载
  2. 升级Android8.0系统原来APP图标变为小机器人的问题
  3. 关于sp和unity近似的PBR的一篇国外文章
  4. 内存泄漏问题该如何解决-面试学习笔记
  5. 手机上好用的APP推荐
  6. zabbix官网下载地址:https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/
  7. 小米4 miui6 android,小米4怎么刷miui6?小米4刷miui6三种方法详解
  8. 无任何编程基础的人,该怎么入门编程?
  9. 双十一哪款蓝牙耳机值得入手?音质超棒的蓝牙耳机推荐
  10. 人工智能领域排名|按AI顶会评实力:美国7倍领先中国,谷歌雄霸全球第一,腾讯和清华分获中国产学No.1...