js 递归学习

作用:将一些复制的算法变为简单,比如:(举例子)计算数组 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]

时间: 2024-12-10 22:58:45

js 递归学习的相关文章

js Array 学习

摘抄自<JavaScript权威指南> 1.join()返回生成的字符串.数组元素转化为字符串,拼接.默认分隔符:“,”. 2.reverse()返回逆序的数组,替换.数组中的元素倒序. 3.sort()返回排序后的数组,替换.数组中的元素排序.无参数:按字母表排序,undefined元素尾部:参数为比较函数: 4.concat()创建并返回一个新数组.新数组的元素:调用concat()的原始数组的元素,concat()的每个参数.参数自身是数组,则连接数组的元素,而非数组本身.不会递归扁平化

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

<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <title>数码时钟</title> <meta charset="gb2312"> <style type="text/css"> *{ padding:0; margin:0;} body{background:rgb(0,2

递归学习(一)最简单的C语言递归求年龄算法

递归是我们在学习编程中,必须要去学习的,虽然递归晦涩难懂 ,但是很多时候,递归的思想会很有用,但是在实际开发中,不建议使用递归,要用循环来代替递归,不然bug无穷. ----------------------------------------------------------- 问题描述: 有5个人坐在一起, 问第5个人,他说比第4个人大2岁, 问第4个人,他说比第3个人大2岁, 问第3个人,他说比第2个人大2岁, 问第2个人,他说比第1个人大2岁, 问最后一个人,他说10岁 第5个人多大

Vue.js 基础学习

今天我开始了Vue.js 的学习. 那么什么是Vue.js 呢? Vue.js是一套开发Web页面的JavaScript脚本框架.听起来感觉很难,不过据说,Vue.js是Web-Javascript脚本框架中最容易上手的框架.所以我便选择了先来学习这个. 要学习Vue.js首先就要获取库文件了,在网上有很多地方可以找到,我是在bootcdn上找到的 接下来我们通过Vue输出一串Hello World ! 首先引入vue. <script src="https://cdn.bootcss.c

Node.js知识点学习

Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 类.最后node.js的出现才开始有了js模块化开发的概念,这使得臃肿的js代码免去了命名冲突等一系列开发难题. Node最大的特点就是采用了异步式I/O与事件驱动的架构设

js数组学习整理

原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); //长度为3 var colors = new Array('red','blue');//初始化 其中,在声明数组的时候,去掉new操作符,也可以. 还有一种初始化数组的方式,使用数组字面量表示法 . 数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开. var colors = [ '

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

要实现的效果如下: 鼠标移入各个小方块,实现对应的效果(变宽,变高,移入透明,移出恢复)~~ (且各运动相互之前不干扰)  主要是练习多个物体的运动框架~~ ----------------------------------------------------js代码如下 ----------------------------------------------------- //执行函数window.onload = function(){ //声明控制变量 var aDiv = docu

js基础学习笔记(二)

2.1  输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出""号内的内容. <script type="text/javascript"> document.write("I love JavaScript!"); //内容用""括起来,""里的内容直接输出.

js基础学习笔记(一)

* 在js编写过程中,尽量保持统一使用单引号 'XXXX': * 所有变量都要声明 var,避免全局函数调用的冲突: 1.1    输出内容 docment.write(‘aileLi’); 改变某ID元素样式 docment.getElementById(‘ID’).style.color=’样式参数’; 1.2   输出弹出框 alert(‘aileLi’); 1.5  什么是变量?  从字面上看,变量是可变的量: 从编程角度讲,变量是用于存储某种/某些数值的存储器. 定义变量使用关键字va