作用:将一些复制的算法变为简单,比如:(举例子)计算数组 var  a =[1,3,4,6,7,8]的长度;求 5!的值,也可以做搜索用等。

          

//求数组的长度
function len(arry){
if(arry[0] == null && arry[0]==undefined)
return 0;
else{
arry.shift();
return 1+ len(arry)
}
} //求5!
function factorial(n){
if(n == 0 ){
return 1;
}else{    
return n*factorial(n-1);
}
}

  

缺陷:如果递归函数的终止条件不明确或者缺少终止条件会导致函数长时间运行,是用户界面处于假死状态。

注意:浏览器对递归的支持熟练与JS调用栈大小直接相关,当使用太多递归甚至超过最大调用栈容量时,浏览器会报错误信息,各个浏览器对报错的提示信息也不一样,比如

    谷歌浏览器console中调用factorial(1000000000)则会返回Uncaught RangeError: Maximum call stack size exceeded(…),我们可以采用一些处理方法来正确处理这         些错误,

  

try{
factorial(100000000000000)
}catch(ex){
console.log("超出最大调用栈")
}

规则:1、知道什么时候停止;

   2、怎样进行下一步;

   3、将问题分解为一个步骤和较小的问题。

搜索问题应用:返回test.data中 name属性值为resultaaa的对象

var test ={
"data": [
{
"a1":[{"a11":[{"a111":{"name":"da"}},
{"a112":{"name":"da"}}]},
{"a12":[{"a121":[{"a1211":{"name":"da"}},
{"a1212":{"name":"da"}}]
}]
},
{"a13":[{"a131":{"name":"da"}},
{"a132":{"name":"da"}}
]
}
]
},{
"b1":null
},{
"c1":[{"c11":null},
{"c12":null},
{"c13":[{"c131":null},
{"c132":[{"c1321":[{"c13211":{"name":"result","companyloacation":"chengdu"}},
{"c13212":{"name":"da"}
}]
},
{"c1322":null}]
}
]}
]
}
]
}
 

  递归函数的实现

var diguitest ={
test:function(arr,finder){
function find(arr,finde){
if(arr == null ||arr == undefined){
return null;//终止在该次对象上的搜索
}
if(arr.name && arr.name == finder ){
return arr;//结束搜索并返回对象
} //不满足上面条件则继续搜索
for(var i in arr){
if(arr[i] instanceof Object){
result = find(arr[i],finder)
//如果找到则依次向上返回该对象
if(result){
return result;
}
}
}
}
return find(arr,finder)
}
}

返回结果:

var cc =  diguitest.test(test.data, "result")

Object {name: "result", companyloacation: "chengdu"}

合并排序应用:将数组 var test  =[2,5,6,8,9,3,1,3,45,6]进行排序

//依次比较两个数组中数字的大小
function merg(left,right){
var result=[];
while(left.length > 0 && right.length >0){
if(left[0] < right[0]){
result.push(left.shift())
}else{
result.push(right.shift())
}
}
return result.concat(left).concat(right);
}
//将数组分为两组---无限分为两组直至不能分为两组为止
function mergSort(item){
//分组终止条件
if(item.length == 1){
return item;
}
var moddle =Math.floor(item.length/2);
var left = item.slice(0,moddle);
var right = item.slice(moddle);
return merg(mergSort(left),mergSort(right));
}

调用后返回结果:

mergSort(test)
[1, 2, 3, 3, 5, 6, 6, 8, 9, 45]

js 递归学习的更多相关文章

  1. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  2. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  3. js入门学习~ 运动应用小例

    要实现的效果如下: 鼠标移入各个小方块,实现对应的效果(变宽,变高,移入透明,移出恢复)~~ (且各运动相互之前不干扰)  主要是练习多个物体的运动框架~~ --------------------- ...

  4. JS入门学习,写一个时钟~

    <!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...

  5. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  6. js再学习笔记

    #js再学习笔记 ##基本 1.js严格区分大小写   2.js末尾的分号可加,也可不加   3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...

  7. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  8. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  9. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

随机推荐

  1. LAMP理论整理

    关于PHP 官网:http://www.php.net 一.PHP简介 PHP是通用服务器端脚本编程语言,其主要用于web开发以实现动态web页面,它也是最早实现将脚本嵌入HTML源码文档中的服务器端 ...

  2. sql高级语句大全

    经典SQL语句大全 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql s ...

  3. hbase数据迁移-HDFS拷贝

    1.把数据表test从hbase下拷出 hdfs dfs -get /hbase/data/default/test /home/hadoop/hbase/test 2.文件放到新集群的系统上 scp ...

  4. 简单方便的div垂直居中。

    此处讨论的是,在一个父容器中只有一个DIV,这个DIV相对于父元素垂直居中的问题: 以下列举三种方式:这里为了层次清晰,都是采用的sass写法. 一:适用于子元素有具体的宽高 .wrap{ //父元素 ...

  5. GCHandler的使用

    众所周知,我们在使用c#托管代码时,内存地址和GC回收那不是我们关心的,CLR已经给我们暗箱操作. 但是如果我们在c#中调用了一个非托管代码,比如vc的DLL,而且他有个回调函数,需要引用c#中的某个 ...

  6. CSS实现三角形

    突然想起搞一把三角形. 简单来说: 建一个div  宽度.高度设为0 添加两个样式: border 和 border-color 如果需要一个三角形把其他边框都设为透明 transparent < ...

  7. LCD相关知识点

    1.LCD即液晶显示器,控制原理是控制其中的电子枪,在n行*n列的屏幕上投射不同颜色从而形成图像 2.编程步骤: ①打开LCD背光将LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选 ...

  8. 第10章 嵌入式Linux的调试技术

    printk函数运行在内核空间,printf函数运行在用户空间.也就是说像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息.printk函数在控制台(也称终端)显示消息是通过 ...

  9. Struts2版本升级到struts2 2.3.15.1操作说明

    Struts2的官网公布了一个远程命令执行漏洞,官方强烈建议升级到2.3.15.1或者以上版本,该版本包含校正过的struts2核心库. 我们之前开发项目主要采用的Struts2版本是2.2.1,本文 ...

  10. linux-命令-ls

    一.命令介绍: ls命令是linux常用的命令之一.ls用来打印当前目录的文件清单或指定目录的文件清单,也可以查看到文件的基本权限和隐藏文件. 二.命令格式: ls [OPTION]... [FILE ...