递归的定义很简单,就是在函数体内调用本函数。递归对于解决一些算法问题有很大的优势,但是递归必须慎重使用,递归函数如果判断条件无法终止,很容易造成内存溢出,报错stack overflow,使程序崩溃。

递归最经典例子,阶乘:

阶乘就是12345......

计算阶乘的函数factorial:

function  factorial(num) { if (num == 0) {  return 1; };return num * factorial(num - 1);
}
复制代码

我们分享过调用栈了,当我们调用factorial(5)的时候,函数运行过程中需要缓存变量,从5一直到2。这对内存使用会比较多。所以有些函数可以处理成尾递归:

function factorial (n, total = 1) { if(n == 1){ return total; }    return factorial(n-1, n * total);
}
复制代码

这样每次都是执行函数,不需要缓存局部变量。

斐波那契数列:

斐波那契数列指的是1、1、2、3、5、8……这样的数列,数学应该都学过,可以推导出公式:F(n) = F(n-1) + F(n-2),且参数大于3。

function fn(n) { if (n < 3) { return 1; // 递归终止条件  }    return fn(n - 1) + fn(n - 2);
}
复制代码

通过调用栈知道,这会形成非常多的调用栈,其实并不推荐使用递归算斐波那契数列,使用循环会是更好的选择。

递归在开发业务过程中基本很难用上,不可能让你写个阶乘写个斐波那契数列。之前水群的时候有人问了个问题:

上面打印orderId明明不一样的, 但是放在下面的循环 结果都一样了?

像这种场景下就可以使用递归,因为请求是异步的,当你成功的时候i可能已经循环到了最后了,这时候在成功回调里面使用递归就能很好解决这个问题。

其他的具体业务使用场景还真的没有很多想法,这边再提一嘴,慎重使用递归,递归总结条件一定要很清晰,递归很容易内存溢出。

Coding 个人笔记

转载于:https://juejin.im/post/5ca40b26e51d451b33391ded

JavaScript递归相关推荐

  1. JavaScript 递归之深度优先和广度优先

    JavaScript 递归之深度优先和广度优先 在前端工作当中,经常会遇到树组件.树形表格.机构树等功能,这个时候就需要对后端返回的数据进行处理,在对树形数据处理时,一般是需要用到递归来处理,而递归又 ...

  2. javascript 递归

    javascript 递归 概念 在程序中函数直接或间接调用自己,然后跳出结构,返回结果 递归的步骤(技巧) 假设递归函数已经写好 寻找递推关系 将递推关系的结构转换为递归体 将临界条件加入到递归体中 ...

  3. javascript递归遍历文件夹下面的所有文件并返回所有文件全路径名称数组以及解析JavaScript方法体字符串的结束位置

    一.前端脚本经常需要用到遍历指定文件夹下面的所有文件(包含子文件夹)的内容并做特定的逻辑处理,下面给出同步遍历的方式,开箱即用. const fs = require('fs');main()func ...

  4. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值

    null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...

  5. 使用Javascript递归遍历本地文件夹

    Created by Jerry Wang, last modified on Aug 13, 2014 打印本地temp folder所有的文件及最后修改时间: <html> <h ...

  6. JavaScript递归应用与实践

    递归简单来说就是函数内调用自生的一种方法,形如: function foo(){foo() } 复制代码 下面我列举一些常用的递归应用. 1. 求和,例如求1+2+3+4+...+100之和 分析如下 ...

  7. 浅谈javascript递归(白话版)

    递归 递归是一种解决问题的方法,通常我们可以理解成函数调用自身: 什么递归?递归怎么写? 首先直接调用自身的方法和函数,他是一个递归,我们看代码: 复制代码 var recursiveFun = fu ...

  8. javascript 递归乘阶

    js递归乘阶  function foo(num){ if(num==1){ return 1; }else{ return num*foo(num-1); } } console.log(foo(1 ...

  9. JS递归的用法JavaScript递归)

    递归: 函数中用调用函数自己,此时就是递归,递归一定要有结束条件 function f1() {console.log("从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事:") ...

最新文章

  1. 使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用
  2. SCOI2014极水的题解- -
  3. 数据结构 2-3-4 静态链表
  4. 黎明杀机手游未能连接服务器,黎明杀机无法连接在线服务及EAC绿条读完后无反应解决方法...
  5. c语言查看错误步骤命令,C语言之预处理命令
  6. 人脸数据库收集——深度学习
  7. php xmp,xmp可以一直开着吗
  8. 冷暖自知 by 张楚
  9. Win10 打印机共享问题解决实录
  10. 2019.08_【FSGAN】_Subject Agnostic Face Swapping and Reenactment 论文翻译
  11. java中的监听器模式
  12. 动态磁盘导致无法进入Mac系统的解决办法
  13. 高清地图(一) - 什么是自动驾驶未来的方向
  14. 从零开始的OpenWRT编译
  15. MobCtrl.exe服务器端软件下载
  16. 利用unity和steamVR完成场景漫游(二) 关于steamVR插件中的代码详解
  17. 内生性问题的产生和解决办法
  18. React 18 新特性(三):渐变更新
  19. 【服务器存储数据恢复】华为OceanStor某型号存储raid5数据恢复案例
  20. 网站遭受攻击,cpu瞬间100%,负载好几百。解决办法

热门文章

  1. 【汇总】一大波CVPR2020开源项目重磅来袭!
  2. MySQL内存预估_mysql时该如何估算内存的消耗,公式如何计算?
  3. SAP Retail 事务代码WSOA1创建Assortment不能选Assortment Category !
  4. AI大厂算法测试心得:人脸识别关键性能指标有哪些?
  5. 让Hinton后悔投少了的AI公司:吴恩达弟子创办,李飞飞也是投资人
  6. 今日 Paper | 新闻推荐系统;多路编码;知识增强型预训练模型等
  7. NeurIPS 2019 少样本学习研究亮点全解析
  8. 阿里巴巴发布AI养蜂系统
  9. 李彦宏候选中国工程院院士
  10. 观点 | 港科大张潼教授最新发言:对人工智能发展的一些思考