作用:将一些复制的算法变为简单,比如:(举例子)计算数组 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. java中equals和“==”补充

    在JDK1.5之后,Integer添加了自动装箱,其形式为Integer i = 5; 装箱过程在内存中是  i = new Integer(4);大家都很熟悉这个吧. 当使用这中形式的时候,equa ...

  2. Git版本库

    创建版本库:git init db 只要用git init db 就可以很容易创建一个空的Git版本库. Git版本库创建好之后,在版本库的目录下有一个.git的子目录中有几项内容,其中注意三项: 1 ...

  3. 进程间通信--fork函数

    #include <unistd.h> pid_t fork(void); fork() creates a new process by duplicating the calling ...

  4. 如何让UIView中的Button点击之后跳转到另一个ViewController上去,ViewController上也有一个按钮 可以返回

    第一种方法:如果使用导航第一个按钮方法:[self.navigationController pushViewController:secondVC animated:YES];第二个按钮方法:[se ...

  5. AFN断点续传思路

  6. C语言程序设计第6堂作业

              一.  本次课主要内容:             通过几个实例来进一步掌握循环结构的应用. 二. 实验内容:(70分) 1. 穷举算法(古典算术问题-搬砖头)某地需要搬运砖块,已知 ...

  7. org.springframework.beans.MutablePropertyValues.add

    最近在项目中,通过maven引入其他包时,启动报错如下: [ERROR][2016-10-08 14:01:20.716]Context initialization failed[org.sprin ...

  8. hdu 2074

    ps:WA了好多次...因为首先是n=1的情况,其次是中心花色和外花色,中心花色也有可能是最外层花色....很无语. 然后就是格式问题咯. 代码 #include "stdio.h" ...

  9. 运行带cocoa pods 的项目,遇到的问题是找不到文件,解决办法

    打开终端,进入项目所在的目录,也就是和Podfile在同一目录下,输入以下命令(由于已经有Podfile,所以不需要再创建Podfile):  pod update 过几秒(也许需要十几秒,取决于你的 ...

  10. Java—从文件中读取数据

    1.FileInputStream() // 构建字节输入流对象,参数为文件名 FileInputStream fin = new FileInputStream("message" ...