javascript递归函数
递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数。
这句话理解起来并不难,从概念上出发,给出以下的例子:
function foo(){
console.log("函数 foo 是递归函数。");
foo();
}
这个例子的 foo 函数就是一个递归函数。
当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此
这个递归函数就演变为一个死循环。
那如何使用递归呢?
使用递归函数必须要符合两个条件:
1、 在每一次调用自己时,必须是(在某种意义上)更接近于解;
这句话怎么理解?
大家家里都有楼梯吧?比如从一楼走到二楼,那么我们的起点是一楼,目的地是二楼,当你往上每走一个台阶是不是越接近二楼,也就是越接近目的地。
因此这句话可以这样理解:函数每一次调用自己时,就越接近于我们期望它完成的任务的终点。
2、必须有一个终止处理或计算的出口。
这句话的意思是:必须要有一个标准的标志,让函数结束调用函数自身。
比如,怎么知道你已经走到二楼了呢?当你看到有个门,门牌上写着 2F 的,然后推开它跨过去,那么你就到二楼了。
用递归输出对象里包含的所有属性值(包括对象里的子孙对象):
var obj = {
a:{
name:"john",
age:26,
sex:"male",
child:{
firstChild:"mak",
laseChild:"loy"
}
}, b:{
name:"joe",
age:28,
sex:"female",
child:{
firstChild:"bill",
secondChild:"ruth",
laseChild:"yoki"
}
}
}; function getObjValue(obj){
for(var k in obj){
if(typeof obj[k] !== "object"){
console.log(obj[k]); //递归出口
}else{
getObjValue(obj[k]); //函数调用函数自身
}
}
}; getObjValue(obj); // 输出结果:
// name=john
// age=26
// sex=male
// firstChild=mak
// laseChild=loy
// name=joe
// age=28
// sex=female
// firstChild=bill
// secondChild=ruth
// laseChild=yoki
使用建议:在使用递归时,要注意对递归函数的参数类型的检查,一定要保证有一个终止处理或计算的出口。否则很容易演变为死循环,从而造成内存溢出。
javascript递归函数的更多相关文章
- Javascript 递归函数
递归函数就是在函数内部调用它自己.在Javascript 中有很多写法,值得我们学习一下(Javascript太灵活了).还是用n的 阶乘 来写例子吧. 1. 首先,来看一个最普通 最正常的写法. f ...
- JavaScript递归函数解“汉诺塔”
“汉诺塔”是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程 ...
- javascript 递归之阶乘
阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ re ...
- 如何使用javascript书写递归函数
递归函数大家都应该比较熟吧?那么,如何在javascript中书写一个完美的递归函数呢?且听我娓娓道来. 递归函数 写的时候,查了一下维基百科对递归函数的定义,恕我愚钝,简直太深奥了!所以,我还是简单 ...
- JavaScript中的递归函数问题
学过其它编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的. function fac(num){ if(num<=1){ return 1; }else{ ...
- [译]Javascript中的递归函数
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- javascript中的递归函数
正常的递归函数如下: function factorial(num){ ){ ; }else{ ); } } 这个函数表面看起来还ok,但如果我们执行下面代码就会出错. var jenny = fac ...
- JavaScript中递归函数用法需要注意的
<script> function sum(num){ if(num<=1){ return 1; }else{ return num*sum(num-1);//return num ...
- JavaScript正则表达式检验与递归函数实际应用
JS递归函数(菲波那切数列) 实例解析: 一组数字:0 1 1 2 3 5 8 13 0 1 2 3 4 5 6 7 sl(0)=0; sl ...
随机推荐
- javascript三角函数的使用
其实很多编程语言里面都有数学函数,而且很多数学函数包括三角函数,只不过有些时候可能我们用的并不多,我最近在做一个h5的游戏,其中有一个需求就是射击的枪支需要更随鼠标变换位置,鼠标移动到什么地方,炮口就 ...
- sqlserver存储过程及临时表在统计中的应用
use ResourceShare --统计使用情况 alter PROCEDURE StaSheryUse @start datetime, @end datetime, @orgId int AS ...
- Redis主从配置及HA方案
首先说下主从同步Replication的原理 在Slave启动并连接到Master之后,它将主动发送一条SYNC命令.此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后 ...
- 自增ID算法snowflake(雪花)
在数据库主键设计上,比较常见的方法是采用自增ID(1开始,每次加1)和生成GUID.生成GUID的方式虽然简单,但是由于采用的是无意义的字符串,推测会在数据量增大时造成访问过慢,在基础互联网的系统设计 ...
- 项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 矢量切图方案目前已经是很常见的一个方案,在2016年时团队 ...
- 学习ASP.NET Core Razor 编程系列二——添加一个实体
在Razor页面应用程序中添加一个实体 在本篇文章中,学习添加用于管理数据库中的书籍的实体类.通过实体框架(EF Core)使用这些类来处理数据库.EF Core是一个对象关系映射(ORM)框架,它简 ...
- IPFS和竞争对手们(二)
在上一篇<IPFS和竞争对手们(一)>的开头抱怨的IPFS的开发进度,今天才得知 MaidSafe 是从2006年起步的( )这进度也是醉了. 接上一篇,今天继续讲IPFS的竞争对手们 图 ...
- Mycat 分片规则详解--取模分片
实现方式:切分规则根据配置中输入的数值n.此种分片规则将数据分成n份(通常dn节点也为n),从而将数据均匀的分布于各节点上. 优点:这种策略可以很好的分散数据库写的压力.比较适合于单点查询的情景 缺点 ...
- 笔记:MyBatis Mapper XML文件详解 - Cache
缓存(Cache) 从数据库中加载的数据缓存到内存中,是很多应用程序为了提高性能而采取的一贯做法.MyBatis对通过映射的SELECT语句加载的查询结果提供了内建的缓存支持.默认情况下,启用一级缓存 ...
- ELK学习笔记(五)简单搜索和DSL查询
检索文档 现在我们有一些数据存储在Elasticsearch中,我们可以开始处理这个应用程序的业务需求. 这在Elasticsearch中很容易.我们只需执行HTTP GET请求并指定文档的地址--索 ...