JavaScript递归应用与实践
递归简单来说就是函数内调用自生的一种方法,形如:
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递归应用与实践相关推荐
- 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式
在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...
- JavaScript设计模式与开发实践——JavaScript的多态
"多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的 ...
- 《JavaScript设计模式与开发实践》阅读摘要
<JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...
- JS代理模式《JavaScript设计模式与开发实践》阅读笔记
代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤. 虚拟 ...
- 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活
专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...
- 《JavaScript设计模式与开发实践》模式篇(5)—— 观察者模式
发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状 态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScript 开发中,我们一般用事件模型 来替代传统的发布- ...
- 《JavaScript设计模式与开发实践》模式篇(3)—— 代理模式
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 故事背景: 假设当 A 在心情好的时候收到花,小明表白成功的几率有 60%,而当 A 在心情差的时候收到花,小明表白的成功率无限趋近于 ...
- JavaScript设计模式与开发实践 | 02 - this、call和apply
this JavaScript的this总是指向一个对象,至于指向哪个对象,是在运行时基于函数的执行环境的动态绑定的,而非函数被声明时的环境. this的指向 this的指向大致可以分为以下4类: 作 ...
- 《JavaScript设计模式与开发实践》原则篇(3)—— 开放-封闭原则
在面向对象的程序设计中,开放封闭原则(OCP)是最重要的一条原则.很多时候,一个程序具有良好的设计,往往说明它是符合开放封闭原则的. 当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增 ...
最新文章
- Java Web 前端高性能优化(二)
- MySQL第10天:MySQL索引优化分析之索引介绍
- golang工程打包不发布
- gre可以用计算机,GRE数学能用计算器吗
- 中文VS2008安装ASP.NET MVC框架解决方案
- mysql 获取日期每行_我如何从MySQL表行获取日期和时间
- [Python] pip 清除缓存
- 互联网核心应用(搜索/推荐/广告)算法峰会
- Kubernetes系统架构演进过程与背后驱动的原因
- Oracle数据库文件中的导入\导出(imp/exp命令)
- Vscode 文件中 查找替换 局部查找 替换快捷键
- Re:从零开始的DS学习 十大排序算法我都整理好了
- 【金猿产品展】云简业财——满足中大型企业个性化需求的报销、费控、预算、业财一体化管理平台...
- PyCharm如何自定义调整字体大小的快捷键
- 面试题目之:说出至少4种vue当中的指令和它的用法?
- 【珍藏版】⼤数据中台架构及解决⽅案
- JVM内存与垃圾回收篇——JVM与Java体系结构
- BIM——建筑信息模型 工程造价培训班
- 修改docker容器中的文件方法
- Android操作系统版本代号与对应的targetSdkVersion