// 递归函数:函数内部自己调用自己,这个函数就是递归函数
// 不断开辟空间,会发生栈溢出。
// 要加入退出条件
function fn(){
fn();
}
fn();
递归题目:
1.求 123……*n 阶乘
function fn(n) {
if(n == 1){
return 1;
}
return n * fn(n - 1) ;
}
console.log(fn(5));
2.求斐波那契数列
// 利用递归函数求斐波那契数列(兔子数列)1、1、2、3、5、8……
// 用户输入一个数字n 就可以求出这个数字对应的兔子的序列值
// 我们只需要知道用户输入的n 的前面两项(n-1 n-2)就可以计算出n 对应的序列值
// fn(6) = fn(5) + fn(4)
// = fn(4) + fn(3) + fn(3) + fn(2)
// = fn(3) + fn(2) + fn(2) + fn(1) + fn(2) + fn(1) + 1
// = fn(2) + fn(1) + fn(2) + fn(2) + fn(1) + fn(2) + fn(1) + 1
// = 1 +1 +1 +1 +1 +1 +1 +1 = 8
function fn(n){
if(n == 1 || n == 2){
return 1;
}
return fn(n-1) + fn(n-2)
}
console.log(fn(6));
3.我们想要做输入id号,就可以返回的数据对象
var data = [
{
id:1,
name:'家电',
goods:[
{
id:11,
gname:'冰箱',
},
{
id:12,
gname:'洗衣机'
}
]
},
{
id:2,
name:'服饰'
}
];
// 1. 利用forEach 去遍历里面的每一个对象
function getID(json,id){
json.forEach(function(item,index,json){
// if执行之后,不会再执行else if的代码
if(item.id == id){
console.log(item);
}
// 里面应该有goods这个数组并且数组的长度不为 0
else if(item.goods && item.goods.length > 0 ){
getID(item.goods,id);
}
})
}
getID(data,12);
// 注意:结束条件隐性说明了:forEach会遍历所有的情况。遍历完即停止递归调用
4.把打印出来的数据返回出来(上面的这个案例)
// 我们想要做输入id号,就可以返回的数据对象
var data = [
{
id:1,
name:'家电',
goods:[
{
id:11,
gname:'冰箱',
},
{
id:12,
gname:'洗衣机'
}
]
},
{
id:2,
name:'服饰'
}
];
// 1.只能获取到第一层的数据
// function getID(json,id){
// var o = {};
// json.forEach(function(item,index,json){
// if(item.id == id){
// o = item;
// }
// else if(item.goods && item.goods.length > 0 ){
// getID(item.goods,id);
// }
// });
// return o;
// }
// 2.可获取多层嵌套的数据
function getID(json,id){
var o = {};
json.forEach(function(item,index,json){
if(item.id == id){
o = item; //这是外部的o,就算是赋值也是赋值给当前层的o, 第二层和第一层的o是断层的,无关的。只能通过return赋值到外部去。
//第二层的数据判断成功之后,要给外部的函数返回出去这个item,才能给外部的函数成功赋值,所以:
return item;
}
else if(item.goods && item.goods.length > 0 ){
// getID(item.goods,id); //如果执行这一步的话,也需要给o赋值才会有数据
o = getID(item.goods,id);
}
});
return o;
}
console.log(getID(data,1));
console.log(getID(data,2));
console.log(getID(data,11));
console.log(getID(data,12));