JavaScript递归

递归

调用自身的函数称为递归函数
递归的作用和循环是基本一致的

作用:

用简单程序解决复杂问题,把大问题层层转化为与原问题相似的规模较小的问题来求解;
只需少量程序就可描述解体过程所需的多次重复计算
创建一个函数,可以用来求任意数的阶乘
1!1
2!1x2=2
3!1x2x3=8

10!1x2x3x4x5x6x7x8x9x10

       function jieCheng(num) {
            let result = 1
            for(let i = 2; i <= num; i++) {
                result *= i;
            }
            return result
        }
        let result = jieCheng(3)
        console.log(result);

如果用递归来解决问题
5!= 4!X 5
4!=3!X 4
3!=2!X 3
2!=1!X 2
1!=1
递归的核心思想就是将一个大问题拆分成一个一个小的问题,小的问题解决了,大的问题也就解决了
编写递归函数,一定要包含两个条件:
1.基线条件 —— 递归的终止条件
2.递归条件 —— 如何对问题进行拆分

        function jieCheng2(num) {
            // 基线条件
            if(num===1) {
                return 1
            }
            // 递归条件
            return jieCheng2(num - 1) * num
        }
        result = jieCheng2(5)
        console.log(result);

递归的作用和循环是一致的,不同点在于,递归思路比较清晰简洁,循环执行性能比较好
在开发中,一般的问题都可以通过循环解决,也是尽量去使用循环,少用递归
只在一些使用循环解决比较麻烦的场景下才使用递归

递归拼接树形结构

[
    { id: 1, parent: null, text: '菜单1' },
    { id: 11, parent: 1, text: '菜单1-1' },
    { id: 12, parent: 1, text: '菜单1-2' },
    { id: 2, parent: null, text: '菜单2' },
    { id: 21, parent: 2, text: '菜单2-1' },
]

把平级的结构变成树形的结构

[
    {
        id: 1, parent: null, text: '菜单1', children: [
            { id: 11, parent: 1, text: '菜单1-1' },
            { id: 12, parent: 1, text: '菜单1-2' },
        ]
    },
    {
        id: 2, parent: null, text: '菜单2', children: [
            { id: 21, parent: 2, text: '菜单2-1' }
        ]
    }
]

步骤:
1.筛选一级菜单

        const rootList = [
            { id: 1, parent: null, text: '菜单1' },
            { id: 11, parent: 1, text: '菜单1-1' },
            { id: 12, parent: 1, text: '菜单1-2' },
            { id: 2, parent: null, text: '菜单2' },
            { id: 21, parent: 2, text: '菜单2-1' },
        ]
        function getTreeList(rootList,id,list) {
            for(item of rootList) {
                if(item.parent == id) {//传进来每一项id的属性 
                    list.push(item)
                }
            }
            console.log('list',list);
        }
        const res = getTreeList(rootList,null,[])
        console.log('res',res);

● null把菜单一和菜单二找出来了
● []最终会把所有数据都组装到空数组中并返回出来,初始值是空数组,然后往里面填充数据
● 某个元素的parent如果是null,就把他筛选出来,所以把菜单1和菜单2筛选出来,然后就是按照分类塞进去子菜单
2.加入子菜单
往每一项里加入一个children

        const rootList = [
            { id: 1, parent: null, text: '菜单1' },
            { id: 11, parent: 1, text: '菜单1-1' },
            { id: 12, parent: 1, text: '菜单1-2' },
            { id: 2, parent: null, text: '菜单2' },
            { id: 21, parent: 2, text: '菜单2-1' },
        ]

        function getTreeList(rootList, id, list) {
            for (item of rootList) {
                if (item.parent == id) {//传进来每一项id的属性 
                    list.push(item)
                }
            }
            for(let i of list) {
                i.children = []
                getTreeList(rootList,i.id,i.children)//运用递归的思想再次调用
            }
            return list
            console.log(list );
        }
        const res = getTreeList(rootList, null, [])
        console.log('res',res);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值