如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。递归函数的作用和循环效果一样。由于递归很容易发生“栈溢出(stack overflow)”错误,所以必须要加退出条件return。我们可以利用递归来求数学题和遍历数据
var num = 1;
function fn() {
console.log("我爱学习");
if(num == 6) {
return;//递归里面必须加退出条件
}
num++;
fn();//在函数内部调用了自身
}
fn();
1、利用递归求数学题
案例1:利用递归函数求1 * 2 * 3 * 4 *…n
function fn(n) {
if(n == 1) {
return 1;
}
return n * fn(n - 1);
}
console.log(fn(3));//输出6
案例2:求斐波那契数列Fibonacci中的第n个数是多少? 1 1 2 3 5 8 13 21…(前两个数相加得到第三个数)
function getF(n) {
if(n == 1 || n == 2){
return 1;
}
return getF(n-1) + getF(n-2);//n-1为n的前一项,n-2为n的前两项
}
console.log(getF(6));//输出8
2、利用递归遍历数据
案例:输入id号就可以返回数据对象
var data = [{
id:1,
name:"美食",
goods:[{
id:11,
gname:"螺蛳粉"
},
{
id:12,
gname:"臭豆腐"
}]
},
{
id:2,
name:"水果"
}];
//利用forEach去遍历里面的每一个对象
function getID(data,id) {
var o = {};
data.forEach(function(item) { //item为数组元素
if(item.id == id) {
//console.log(item);
o = item;//这里的o是得到外层数据
return item;
//想要得到里层的数组的数据11和12可以利用递归函数
//符合条件为里面有goods这个数组并且这个数组的长度不为0
} else if(item.goods && item.goods.length > 0) {
o = getID(item.goods,id);//函数调用必须有返回值,调用的时候通过上面的return返回item并赋给o,这里的o是得到里层数据
}
})
return o;
}
console.log(getID(data,1));
console.log(getID(data,11));
运行结果: