递归简单来说就是函数内调用自生的一种方法,形如:

function foo(){foo()
}
复制代码

下面我列举一些常用的递归应用。

1. 求和,例如求1+2+3+4+...+100之和

分析如下:

sum(100)=sum(99)+100
sum(99)=sum(98)+99
...
sum(1)=sum(0)+1
复制代码

代码实现:

function sum(n){if(n==1) return 1return sum(n-1)+n
}
console.log(sum(100)) // 5050
复制代码

特意说明一下使用递归一定不要忽略退出条件,否则会陷入死循环。

2.求阶乘 例如10!

function factorial(n) {if(n==1) return 1return factorial(n-1)*n
}
console.log(factorial(10)) // 3628800
复制代码

3.平展组织

在实际应用之中,经常会遇到类似于组织树结构

var tree=[{name:'jack',children:[{name:'jack2',children:[{name:'jack3'}]}]},{name:'tom',children:[{name:'tom2',children:[{name:'tom3'}]}]}...
]
复制代码

我们往往需要对组织树进行平展来更方便我们的开发,例如我们需要得到一个所有的名称name数组等,采用递归实现如下:

var res=[]
function flatTree(arr){for(let i=0;i<arr.length;i++){   res.push({name:arr[i].name})if(arr[i].children.length!=0){return flatTree(arr[i].children)}else{continue;}}
}
tree.forEach(function(item,index){flatTree([item])
})
复制代码

4.数据分组

例如对于数组[1,5,10,15,21,26,31,36,41,50,55,70] 每隔五秒应该要有数据,如果不是每隔五秒的数据应该划入下一个组中,即分组后应该为

[[1,5,10,15],[21,26,31,36,41],[50,55],[70]
]
复制代码

实现代码如下:

unction group(data) {if(data.length==0){return false}for(let i=0;i<data.length;i++){if (data[i+1] && (data[i+1]-data[i]<5)) {continue;} else {result.push(data.splice(0,i+1))group(data)break }}return
}
group(data)
console.log(result)
复制代码

5. 对象复制(深拷贝)

function deepCopy(obj) {var result = Array.isArray(obj) ? [] : {};for (var key in obj) {if (obj.hasOwnProperty(key)) {if (typeof obj[key] === 'object') {result[key] = deepCopy(obj[key]);} else {result[key] = obj[key];}}}return result;
}
复制代码

JavaScript递归应用与实践相关推荐

  1. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

  2. JavaScript设计模式与开发实践——JavaScript的多态

    "多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的 ...

  3. 《JavaScript设计模式与开发实践》阅读摘要

    <JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...

  4. JS代理模式《JavaScript设计模式与开发实践》阅读笔记

    代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤. 虚拟 ...

  5. 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活

     专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...

  6. 《JavaScript设计模式与开发实践》模式篇(5)—— 观察者模式

    发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状 态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScript 开发中,我们一般用事件模型 来替代传统的发布- ...

  7. 《JavaScript设计模式与开发实践》模式篇(3)—— 代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 故事背景: 假设当 A 在心情好的时候收到花,小明表白成功的几率有 60%,而当 A 在心情差的时候收到花,小明表白的成功率无限趋近于 ...

  8. JavaScript设计模式与开发实践 | 02 - this、call和apply

    this JavaScript的this总是指向一个对象,至于指向哪个对象,是在运行时基于函数的执行环境的动态绑定的,而非函数被声明时的环境. this的指向 this的指向大致可以分为以下4类: 作 ...

  9. 《JavaScript设计模式与开发实践》原则篇(3)—— 开放-封闭原则

    在面向对象的程序设计中,开放封闭原则(OCP)是最重要的一条原则.很多时候,一个程序具有良好的设计,往往说明它是符合开放封闭原则的. 当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增 ...

最新文章

  1. Java Web 前端高性能优化(二)
  2. MySQL第10天:MySQL索引优化分析之索引介绍
  3. golang工程打包不发布
  4. gre可以用计算机,GRE数学能用计算器吗
  5. 中文VS2008安装ASP.NET MVC框架解决方案
  6. mysql 获取日期每行_我如何从MySQL表行获取日期和时间
  7. [Python] pip 清除缓存
  8. 互联网核心应用(搜索/推荐/广告)算法峰会
  9. Kubernetes系统架构演进过程与背后驱动的原因
  10. Oracle数据库文件中的导入\导出(imp/exp命令)
  11. Vscode 文件中 查找替换 局部查找 替换快捷键
  12. Re:从零开始的DS学习 十大排序算法我都整理好了
  13. 【金猿产品展】云简业财——满足中大型企业个性化需求的报销、费控、预算、业财一体化管理平台...
  14. PyCharm如何自定义调整字体大小的快捷键
  15. 面试题目之:说出至少4种vue当中的指令和它的用法?
  16. 【珍藏版】⼤数据中台架构及解决⽅案
  17. JVM内存与垃圾回收篇——JVM与Java体系结构
  18. BIM——建筑信息模型 工程造价培训班
  19. 修改docker容器中的文件方法
  20. Android操作系统版本代号与对应的targetSdkVersion

热门文章

  1. PM2管理工具的使用
  2. Xshell配置ssh免密码登录-密钥公钥(Public key)
  3. php-fpm配置笔记
  4. 【MySql】linux下,设置mysql表名忽略大小写
  5. web.py端口被占用的错误
  6. 关于颜色值透明度的设置
  7. Linux运行级详解
  8. struts2+jquery 实现ajax登陆
  9. tar 压缩与解压缩打包命令
  10. Linux、Windows、Mac下Docker的安装与使用