作用:将一些复制的算法变为简单,比如:(举例子)计算数组 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. 面试复习(C++)之快速排序

    #include <iostream> using namespace std; void Quicksort(int *a,int low,int high) { if(low>h ...

  2. visor 发布

    2014-4-10 visor.com.cn  的域名备案终于审核通过了.http://www.visor.com.cn 终于可以访问了,欢迎大家使用免费的线框图应用设计工具.

  3. ASP.NET后台调用前台JS函数的三种常见方法

    第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add("onclick","MyFun( ...

  4. java基础知识--CLASSPATH

    如果在一个类中用到了另外一个类(new了一个新对象). package com.xxx.xxx; public class Cat { } //下面是另外的文件 public class Dog { ...

  5. jQuery中的$.grep()方法的使用

    标签: it 分类: jQuery grep()方法用于数组元素过滤筛选 grep(array,callback,invert) array:待过滤数组; callback:处理数组中的每个元素,并过 ...

  6. ZBJ的linux

    PHP服务器 PHP服务器的IP可以ping出来 目录结构:a.代码目录统一为: /data/www/html/zbjv6b.Nginx 配置文件目:/etc/nginx/sites-enabledc ...

  7. android 网络请求库的比较

    源码请戳 一. 现有库和选择的库 HttpURLConnection:是Java中的标准类,是对Java中socket的封装. Httpclient:是Apache的开源框架,是对HttpURLCon ...

  8. elasticsearch,python包pyes进行的处理

    elasticsearch:高性能搜索引擎,官网:https://www.elastic.co/products/elasticsearch/ 对于它相信大家都不陌生,es的使用已经广泛存在 各大网站 ...

  9. 第6章 第一个Linux驱动程序:统计单词个数

    编写一个Linux的一般步骤: 第1步:建立Linux驱动骨架(装载和卸载Linux驱动) 第2步:注册和注销设备文件 第3步:指定和驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步 ...

  10. NSOperationQueue的其他方法

    1.设置最大并发数 什么是并发数 同时执行的任务数 比如,同时开3个线程执行3个任务,并发数就是3   最大并发数的相关方法 - (NSInteger)maxConcurrentOperationCo ...