作用:将一些复制的算法变为简单,比如:(举例子)计算数组 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. python学习09——字典(3)

    今天写了一道python字典题目,用了上次字典(2)中的方法,代码如下: json = {', 'IP':'10.0.0.1'} def find_value(themap, word): if wo ...

  2. ppp数据帧的格式

    参考http://blog.chinaunix.net/uid-11639156-id-2379044.html

  3. IOS App 右上脚红色数字提醒

    IOS8.0以前直接显示: UIApplication *application=[UIApplication sharedApplication]; //设置图标上的更新数字 application ...

  4. IOS UITableView移除底部空白行

    tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

  5. boost和C++11中的sleep

    boost boost线程中表示睡眠的函数有sleep和sleep_for sleep 例如: boost::this_thread::sleep(boost::posix_time::seconds ...

  6. 使用JavaScript的history对象来实现页面前进后退(go/back/forward)。

    我们都知道JavaScript有history对象,主要是用来记录浏览器窗口的浏览记录.但是,JS脚本是不允许访问到这个记录里面的内容(隐私). 常见的用法是: history.back();//返回 ...

  7. 开源一个网络图片浏览器HooPhotoBrowser

    在公司开发项目中需要弹出展示从网络上下载的图片,并提供滑动展示功能.目前采用同事开发的图片浏览器,后期有时间想优化一下.所以重温了下以前开发的类似微博的项目中的图片浏览器代码,并抽取出来封装成了现在这 ...

  8. JavaScript测试工具比较: QUnit, Jasmine, and Mocha

    1. QUnit A JavaScript Unit Testing framework. QUnit is a powerful, easy-to-use JavaScript unit testi ...

  9. 发布mvc遇到的HTTP错误 403.14-Forbidden解决办法

    发布mvc遇到的HTTP错误 403.14-Forbidden解决办法   <system.webServer>   <validationvalidateIntegratedMod ...

  10. Mac下设置系统PATH

    1. 进入当前用户的home目录 输入cd ~ 2. 创建.bash_profile 输入touch .bash_profile 3. 编辑.bash_profile文件 输入open -e .bas ...