第二课:函数进阶(六):递归(2021/4/19)

// 递归函数:函数内部自己调用自己,这个函数就是递归函数
// 不断开辟空间,会发生栈溢出。
// 要加入退出条件

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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值