阅读 133

JavaScript递归详述

这篇文章主要介绍了JavaScript递归,递归就是当一个函数可以调用自己,那么这个函数就是递归,接下俩我们就来看看下面文章的详细介绍内容,需要的小伙伴可以参考一下,希望对你有所帮助

目录
  • 一、什么是递归?

  • 二、利用递归求数学题

    • 1、求1 * 2 * 3 * 4 …*n的阶乘

    • 2、 求斐波那契数列

  • 三、利用递归求对应数据对象

    一、什么是递归?

    如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数。

    如下所示:

    1
    2
    3
    4
    function fn(){
     fn();
    }
    fn();

    这个函数就是一个递归函数,当我们直接打印时,会:

    在这里插入图片描述

    发现打印错误,这是为什么呢?因为递归函数的作用和循环效果一样。当没有给他返回值的时候,它就会一直死循环下去。所以,我们知道了:

    由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

    那正确的递归函数应该怎样写呢?以上述代码为例:比如我们现在要打印五遍‘你好',这时,我们应该这样来写:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var num = 1;
    function fn(){
                console.log('你好');
                if(num == 5){
                    return;
                }
                num++;
                fn();
            }
            fn();

    打印结果为:

    在这里插入图片描述

    知道了递归是什么,那我们再来看看如何利用递归解决问题吧!

    二、利用递归求数学题

    1、求1 * 2 * 3 * 4 …*n的阶乘

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function fn(n){
              if(n == 1){
                  return 1;
              }
              return n*fn(n-1);
          }
          console.log('1-20的阶乘为:'+fn(20));
          console.log('1-10的阶乘为:'+fn(10));
          console.log('1-5的阶乘为:'+fn(5));

    打印结果为:

    在这里插入图片描述

    2、 求斐波那契数列

    斐波那契数列,又称为“兔子数列”,指的是这样一个数列:、1、1、2、3、5、8、13、21、34、……,即第三项的值为前两项的加和。用户输入一个n,就可以得到该位置的数。

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    function fb(n){
                if(n === 1 || n === 2){
                    return 1;
                }
                return fb(n-1) + fb(n-2);
            }
           console.log('第3项斐波那契数列值为:'+fb(3));
           console.log('第10项斐波那契数列值为:'+fb(10));

    打印结果为:

    在这里插入图片描述

    三、利用递归求对应数据对象

    根据id返回对应的数据对象

    有如下所示的对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    var date = [{
        id:1,
        name:'电器',
        goods:[{
            id: 11,
            gname:'手机'
        },{
            id: 12,
            gname: '电脑'
        }]
    },{
        id:2,
        name:'服饰',
        goods:[{
            id : 21,
            gname:'裤子'
        },{
            id : 22,
            gname : '外套'
            }]
    },{
        id : 3,
        name: '食品'
            }];

    现在要通过输入id返回对应的数据对象。

    首先我们可以通过for...Each()来遍历数组,得到每一项值,如下所示:

    1
    2
    3
    4
    5
    6
    function getId(array,id){
                        array.forEach(function(value){
                            console.log(value);
                        })
                    }
                    getId(date,1);

    打印的结果为:

    在这里插入图片描述

    这时,如果我们想要获得id为1的对象的值,可以这样操作:

    1
    2
    3
    4
    5
    6
    7
    8
    function getId(array,id){
                        array.forEach(function(value){
                           if(value.id === id){
                               console.log(value);
                           }
                        })
                    }
                    getId(date,1);

    打印结果为:

    在这里插入图片描述

    可以得到,但是如果我们想要得到id为11的对象的值呢?很明显,直接调用该函数是不可行的,因为我们通过for...Each只是遍历得到了最外层的对象的值,而内层的具体分类并没有得到,这时,我们就可以通过递归调用getId(array,id)函数,来获取里层对象的值。

    操作如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function getId(array,id){
                       array.forEach(function(value){
                          if(value.id === id){
                              console.log(value);
                          }else if(value.goods && value.goods.length !=0){
                               getId(value.goods,id);
                          }
     
                       })
                   }
                   // getId(date,1);
                   getId(date,11);

    打印的结果为:

    在这里插入图片描述

    到此这篇关于JavaScript递归详述的文章就介绍到这了

    原文链接:https://blog.csdn.net/m0_48375854/article/details/121498134


    文章分类
    代码人生
    文章标签
    版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
    相关推荐