什么是递归函数?

简单定义:当函数直接或者间接调用自己时,则发生了递归.” 说起来简单, 但是理解起来复杂, 因为递归并不直观, 也不符合我们的思维习惯, 相对于递归, 我们更加容易理解迭代. 因为我们日常生活中的思维方式就是一步接一步的, 并且能够理解一件事情做了N遍这个概念. 而我们日常生活中几乎不会有递归思维的出现.

举个简单的例子:
求1到5的累加和 下面是传统的方式, 我们一般都这样通过迭代来计算累加和, 也很好理解.


而事实上, 我们也可以通过递归来完成这样的任务.

只不过, 我们都不这么做罢了, 虽然这样的实现有的时候可能代码更短, 但是很明显, 从思维上来说更加难以理解一些. 当然, 我是说假如你不是习惯于函数式语言的话. 这个例子相对简单, 稍微看一下还是能明白吧.

作为这么简单的例子, 两种算法其实大同小异, 虽然我们习惯迭代, 但是, 也能看到, 递归的算法无论是从描述上还是实际实现上, 并不比迭代要麻烦.

理解递归

在初学递归的时候, 看到一个递归实现, 我们总是难免陷入不停的回溯验证之中, 因为回溯就像反过来思考迭代, 这是我们习惯的思维方式, 但是实际上递归不需要这样来验证.
要实现递归要书写两个内容:
一个是满足结束条件的时候结束函数
一个是不满足结束条件的时候要执行的代码

我们拿上面案例来作为分析:
1.我要书写一个函数叫做add
2.这个函数有形参n,调用的时候:add(n)
3.我这个add函数的功能是计算任意一个数1到n的累加和。
这里以n=5来分析

分析思路:

第一遍
计算输入的n即n=5;程序开始执行,
返回的是add( 5 - 1) + 5 的值,即返回的是add(4)+5的值,add(4)的值是多少?
因为没有具体数值,程序就要去执行add(4),即调用第二遍

第二遍
计算add(4),程序开始执行,
返回的是add( 4 - 1) + 4 的值,即返回的是add(3)+4的值,add(3)的值是多少?
因为没有具体数值,程序就要去执行add(3),即调用第三遍

第三遍
计算add(3),程序开始执行,
返回的是add( 3 - 1) + 3 的值,即返回的是add(2)+3的值,add(2)的值是多少?
因为没有具体数值,程序就要去执行add(2),即调用第四遍

第四遍
计算add(2),程序开始执行,
返回的是add( 2 - 1) + 3 的值,即返回的是add(1)+2的值,add(1)的值是多少?
因为没有具体数值,程序就要去执行add(1),即调用第五遍

第五遍
计算add(1),程序开始执行,
当n==1 时,满足第一个条件,返回的值是1,是一个具体数值,此时函数不在调用自身。
看到这里我们就应该明白此时

add(1)=1
add(2)=add(1)+2 =1+2
add(3)=add(2)+3=1+2+3
add(4)=add(3)+4=1+2+3+4
add(5)=add(4)+5=1+2+3+4+5


add(n)=add(n-1)+n=1+2+3+4+5+…+n

注意点:使用递归时,要有结束条件,否则就会“死循环”,造成浏览器崩溃。

使用递归

既然递归比迭代要难以理解, 为啥我们还需要递归呢? 从上面的例子来看, 自然意义不大, 但是很多东西的确用递归思维会更加简单……

经典的例子就是斐波那契数列(Fibonacci sequence),又称黄金分割数列、
因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,
指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,
斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3)

        有了递归的算法, 用程序实现实在再简单不过了:


改为用迭代实现呢? 你可以试试.

递归的问题

当然, 这个世界上没有啥时万能的, 递归也不例外, 首先递归并不一定适用所有情况, 很多情况用迭代远远比用递归好了解, 其次, 相对来说, 递归的效率往往要低于迭代的实现, 同时, 内存耗用也会更大, 虽然这个时候可以用尾递归来优化, 但是尾递归并不是一定能简单做到.它是依据数据结构的栈的原理,不断开辟新的内存空间以满足程序需要,而不是不断改变已有内存空间的值来满足程序需要,所以递归是一种极具消耗内存资源的算法思维,所以在现实项目中,除非代码量影响过大,否则能不用递归就不用递归.

参考

精通递归程序设计

创作不易,点个赞吧!!

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://blog.csdn.net/qms888888

JS递归算法经典案例与分析相关推荐

  1. 记一次对网络抖动经典案例的分析 1

    视频学习 性能抖动剖析(一) 性能抖动剖析(二) 性能抖动剖析(三) 网络抖动案例是一类处理难度较大的问题,原因主要是很多抖动发生的频率不高,且持续时间非常短极限情况可能仅有100ms以下,而很多用户 ...

  2. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例

    Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...

  3. html中js计算百钱百鸡,JS经典案例之百钱百鸡

    今天我们来回顾一下JS的经典案例之百钱百鸡 题目 公鸡5元钱一只,母鸡3元钱一只,小鸡3只一元钱,用100元钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100元钱 ...

  4. 经典案例拆解:3天涨粉18W,我是如何策划的免费送活动的?

    编辑导读:在活动运营时,免费送XXX活动是很常见的一种方式.但是近些年来,这种方式并不吃香了,这是怎么回事呢?本文作者根据自身工作经历,拆解了一个经典案例进行分析,希望对你有帮助. 我们常常会看到免费 ...

  5. 基于海康SDK开发文档分析+云台控制实现+经典案例

    基于海康SDK开发文档分析+云台控制实现+经典案例 上一篇:海康威视java开发+demo运行+调用dll动态库坑 一.准备 海康的SDK下载 https://www.hikvision.com/cn ...

  6. 中亦安图oracle培训,【中亦安图】Systemstate Dump分析经典案例(8)

    第一章技术人生系列·我和数据中心的故事(第八期)Systemstate Dump分析经典案例(下) 中亦安图 | 2016-03-08 21:45 前言 接上一期:(上一期的阅读方法:关注" ...

  7. 【中亦安图】Systemstate Dump分析经典案例(7)

    第一章 技术人生系列 · 我和数据中心的故事(第七期)Systemstate Dump分析经典案例(上) 中亦安图 | 2016-03-03 21:42 前言 本期我们邀请中亦科技的另外一位Oracl ...

  8. 分层结构的生活例子_层次分析法经典案例

    层次分析法经典案例 篇一:层次分析法步骤 层次分析法实例与步骤 结合一个具体例子,说明层次分析法的基本步骤和要点. [案例分析] 市政工程项目建设决策: 层次分析法问题提出 市政部门管理人员需要对 修 ...

  9. python泰坦尼克号案例分析_泰坦尼克Python经典案例

    12. 章节 12 - 结论和步骤 7: 优化和战略 如何使用本教程 : 请阅读本内核中提供的解释和相关链接.我们的目标不只是知道 " 是什么 " ,还要知道 " 为什么 ...

  10. acm水仙花数java,水仙花数之C语言经典案例分析

    水仙花数之C语言经典案例分析 一.[什么是水仙花数] 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI) ...

最新文章

  1. 大学生计算机基础excel视频,大学生计算机基础Excel.doc
  2. 数学奥赛用不用计算机,报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你?...
  3. 【Linux系统编程应用】 Linux输入子系统(二)
  4. A. Slackline Adventure(思维 + 莫比乌斯)(2018-2019 ACM-ICPC Brazil Subregional Programming Contest)
  5. JavaFX图表(四)之面积图
  6. JAVA jlist 获取选定,java - 拆分并将选定的jList值移动到jTable行(SWING) - 堆栈内存溢出...
  7. 2021年中国中心线市场趋势报告、技术动态创新及2027年市场预测
  8. java语言采用16位颜色标准_华为Java笔试题一
  9. Windows自带便签工具Sticky Notes
  10. umount 无法成功
  11. One Drive 回收站文件太多时无法清空回收站解决办法
  12. linux iio 设备驱动,Linux设备驱动之IIO子系统——IIO框架数据读取,linuxiio
  13. STM32汇编语言点亮led灯
  14. Mysql技术内幕innodb引擎笔记
  15. WPF 获取主程序(主窗口)对象
  16. 货币竞争,不是货币战争
  17. 本周涨粉一倍,我决定再开源一个商超管理系统
  18. 创建alexa skill
  19. Sangria:PLONK + Folding
  20. 解决VScode中文乱码问题

热门文章

  1. Java实现获取汉字的拼音(首拼)
  2. 让代码更美:10大编程字体
  3. uniapp打包H5与uniapp打包apk交互,实现扫码功能。
  4. STM32串口通讯初步学习
  5. 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  6. 【已解决】戴尔笔记本电脑的卡顿问题.
  7. 【老生谈算法】matlab实现Retinex算法视频增强——Retinex算法
  8. Ubuntu服务器长时间运行爬虫程序
  9. QT+Opencv视频文件TCP网络传输
  10. Oracle数据库的下载安装教程