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