zoukankan      html  css  js  c++  java
  • js 递归的理解

    友情提示:阅读本文需花 3分钟左右!

    • 递归函数必须接受参数。 (比如我要递归谁?)
    • 在递归函数的定义初始,应该有一个判断条件,当参数满足这个条件的时候,函数停止执行,并返回值。(指定退出条件,否则就会死循环)
    • 每次递归函数执行自己的时候,都需要把当前参数做某种修改,然后传入下一次递归。(每次循环在调用自己一次并传参)
    • 当参数被累积修改到符合初始判断条件了,递归就停止了。(最后满足条件就退出)

    一句话概括:所谓的递归函数就是在函数体内调用n次本函数。

    幼儿园化: 自己玩自己(强撸灰飞XX),或者累了(满足条件)自己退出。

    具体示例(直接复制可运行): 

     // 递归简单demo
        let num = 0;
        function recursion(params) {
            if (params > 100) {
                return
            } else {
                //debugger
                num += params;
                return recursion(params + 1)
            }
        }
        recursion(0)
        console.log(num);  // 5050
     
     
    // 递归升级版,递归树
        const data = [{
            "area_id": 5,
            "name": "广东省",
            "parent_id": 0,
        }, {
            "area_id": 6,
            "name": "广州市",
            "parent_id": 5,
        }, {
            "area_id": 7,
            "name": "深圳市",
            "parent_id": 5,
        }, {
            "area_id": 4,
            "name": "北京市",
            "parent_id": 3,
        }, {
            "area_id": 3,
            "name": "北京",
            "parent_id": 0,
        }, {
            "area_id": 2,
            "name": "测试子地区",
            "parent_id": 1,
        }, {
            "area_id": 1,
            "name": "测试地区",
            "parent_id": 0,
        }]

        function toTreeData(data, pid) {
            function tree(id) {
                let arr = []
                data.filter(item => {
                    return item.parent_id === id;
                }).forEach(item => {
                    console.log(arr.length);
                    if (!tree(item.area_id).length) {
                        arr.push({
                            area_id: item.area_id,
                            label: item.name,
                        })
                    } else {
                        arr.push({
                            area_id: item.area_id,
                            label: item.name,
                            children: tree(item.area_id)
                        })
                    }
                })
                return arr
            }

            return tree(pid) // 第一级节点的父id,是null或者0,视情况传入
        }
        console.log(toTreeData(data, 0));
    结果如下
  • 相关阅读:
    架构师维度理解 程序=数据+算法
    vuejs 中 select 动态填充数据,后台的数据
    vuejs 的错误代码,有助于理解
    graphviz 绘制架构图
    graphviz 布局和子图,表格教程
    graphviz layer 教程(非布局)
    待学习
    Linux进程管理
    TCP连接的11种状态,三次握手四次挥手原因
    Linux基本命令使用(三)
  • 原文地址:https://www.cnblogs.com/youguo2/p/12935376.html
Copyright © 2011-2022 走看看