为了账号安全,请及时绑定邮箱和手机立即绑定

复习+学习 递归

标签:
Html5 JavaScript

我们继续递归的一个问题,有闭包没有递归怎么能行

第一个递归的案例就是用递归求阶乘,这应该是典中典了吧

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 用递归来求阶乘 无限调用函数一级一级往下乘
        function fn(n) {
            if (n == 1) {
                return 1
            }
            return n * fn(n -1)
        }
        console.log(fn(3));
        console.log(fn(5));
    </script>
</body>
</html>

有阶乘,那就必须要有斐波拉契亚数列,这两个呢其实就是拿来熟悉递归的,别看简单,其实要理解透也要点逻辑能力的,还是挺不容易的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 利用递归求斐波那契数列  1、1、2、3、5、8、13、21。。。后面的值为前两项值得和
        // 用户输入一个数字n就可以求出这个数字对应的斐波拉契数列的值 比如输入4 就会得到3 输入6就会得到8
        // 分析 首先我们得到那个条件是用户输入的数字 有点抽象了 后面的概念 用户输入的数字就是我们要找的第n项 然后再结合斐波拉契数列的规律 我们要求第n项的值就可以由它的前两项的值相加所得 所以当用户输入第n项后 就可以通过n-1 和 n-2得到它的前两项的和 再由当前的前两项的和 通过递归的求法 
        function getNum(n) {
            if (n == 1 || n == 2) {
                return 1
            }
            return getNum(n - 1) + getNum(n - 2)
        }
        console.log(getNum(7));
    </script>
</body>
</html>

然后是一个输入id来拿数据的案例,这个案例其实还挺复杂的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 输入id号 返回对应的数据对象 -->
    <script>
        // 完善 总不能通过console。log来拿数据 所以是不方便的 这里可以新定义一个对象 来保存在里面
        var good = {}
        var data = [{
            id : 1,
            name : '家电',
            goods : [{
                id : 11,
                gName : '电视机'
            },
            {
                id : 12,
                gName : '电冰箱'
            }]
        },{
            id : 2,
            name : '服装'
        }]
        function getID(Name, id) {
            Name.forEach(function(subject) {
                if (subject.id == id) {
                    good = subject
                } else if(subject.goods && subject.goods.length != 0){
                    getID(subject.goods, id)
                }
            })
            return good
        }
        console.log(getID(data, 1));
        // 如何实现数组里的元素里的元素查找id
        console.log(getID(data, 11));
    </script>
</body>
</html>

最后是一个深拷贝的案例,这个和前面一个是递归里面,我觉得比较能说明问题的两个案例,逻辑能力挺强的,不管是上一个还是这一个,慢慢的就开始变复杂了看得出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        }
        var o = {}
        function getCopy(useCopy, usedCopy) {
            for (var k in usedCopy) {
                if (usedCopy[k] instanceof Array) {
                    useCopy[k] = []
                    getCopy(useCopy[k], usedCopy[k])
                } else if (usedCopy[k] instanceof Object) {
                    useCopy[k]  = {}
                    getCopy(useCopy[k], usedCopy[k])
                } else {
                    useCopy[k] = usedCopy[k]
                }
            }
            return useCopy
        }
        getCopy(o, obj)
        console.log(o);
        o.msg.sex = '男'
        console.log(o);
        console.log(obj);
    </script>
</body>
</html>

前端爱好者,望大佬给个内推机会!!!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
0
获赞与收藏
1

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消