递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数。这句话理解起来并不难,从概念上出发,给出以下的例子:
function foo(){
console.log("函数 foo 是递归函数。");
foo();
}
function foo(){
console.log("函数 foo 是递归函数。");
foo();
}这个例子的 foo 函数就是一个递归函数。当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环。那如何使用递归呢?使用递归函数必须要符合两个条件:使用递归函数必须要符合两个条件:使用递归函数必须要符合两个条件:1、 在每一次调用自己时,必须是(在某种意义上)更接近于解;1、 在每一次调用自己时,必须是(在某种意义上)更接近于解;这句话怎么理解?大家家里都有楼梯吧?比如从一楼走到二楼,那么我们的起点是一楼,目的地是二楼,当你往上每走一个台阶是不是越接近二楼,也就是越接近目的地。
因此这句话可以这样理解:函数每一次调用自己时,就越接近于我们期望它完成的任务的终点。2、必须有一个终止处理或计算的出口。2、必须有一个终止处理或计算的出口这句话的意思是:必须要有一个标准的标志,让函数结束调用函数自身。
比如,怎么知道你已经走到二楼了呢?当你看到有个门,门牌上写着 2F 的,然后推开它跨过去,那么你就到二楼了。用递归输出对象里包含的所有属性值(包括对象里的子孙对象):
var obj = {
a:{

name:"john",

age:26,

sex:"male",

child:{

firstChild:"mak",

laseChild:"loy"

}
},

b:{

name:"joe",

age:28,

sex:"female",

child:{

firstChild:"bill",

secondChild:"ruth",

laseChild:"yoki"

}
}
};

function getObjValue(obj){
for(var k in obj){

if(typeof obj[k] !== "object"){

console.log(obj[k]); //递归出口

}else{

getObjValue(obj[k]); //函数调用函数自身

}
}
};

getObjValue(obj);
var obj = {
a:{

name:"john",

age:26,

sex:"male",

child:{

firstChild:"mak",

laseChild:"loy"

}
},

b:{

name:"joe",

age:28,

sex:"female",

child:{

firstChild:"bill",

secondChild:"ruth",

laseChild:"yoki"

}
}
};

function getObjValue(obj){
for(var k in obj){

if(typeof obj[k] !== "object"){

console.log(obj[k]); //递归出口

}else{

getObjValue(obj[k]); //函数调用函数自身

}
}
};

getObjValue(obj);// 输出结果:

// name=john
// age=26
// sex=male
// firstChild=mak
// laseChild=loy
// name=joe
// age=28
// sex=female
// firstChild=bill
// secondChild=ruth
// laseChild=yoki
// name=john
// age=26
// sex=male
// firstChild=mak
// laseChild=loy
// name=joe
// age=28
// sex=female
// firstChild=bill
// secondChild=ruth
// laseChild=yoki使用建议:在使用递归时,要注意对递归函数的参数类型的检查,一定要保证有一个终止处理或计算的出口。否则很容易演变为死循环,从而造成内存溢出。