友情提示:阅读本文需花 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));
结果如下

最新文章

  1. Appfuse:记录操作日志
  2. 指定的架构无效。错误: CLR 类型到 EDM 类型的映射不明确
  3. XCode新建Class时自动加前缀(class prefix 修改前缀)
  4. 利用sklearn计算文本相似性
  5. C语言练习代码
  6. IPv6套接字地址结构
  7. seajs路径问题及源码分析
  8. cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中(转)
  9. 二、HDFS学习
  10. shell脚本中的整数测试
  11. Jmeter-阶梯场景设置
  12. android --------- 嵌套unity出现 your hardware does not support this application,sorry!
  13. 为什么C++函数形参默认值从最末一个赋值?
  14. 【BZOJ-2329&2209】括号修复&括号序列 Splay
  15. 基于PHPExcel常用方法总结(phpexcel类库实例)
  16. python中filter(),map()和reduce()的用法及区别
  17. 【Java】JVM(一)、Java内存区域
  18. Lucene之Java实战
  19. UVALive - 6436 —(DFS+思维)
  20. ilmerge工具合并多个DLL或EXE

热门文章

  1. Activiti7 网关(包含网关)
  2. Oracle中真正稳妥的求三甲的方法
  3. 经典SQL问题:Top 10%
  4. leetcode刷题-52N皇后2
  5. 判断语句 、 while循环 、 for循环
  6. 漏洞扫描工具acunetix12会遇到的问题
  7. Book of Shaders 02 - 矩阵:二维仿射变换练习
  8. Linux高级命令进阶
  9. hw小技巧(转载)
  10. 20行代码实现,使用Tarjan算法求解强连通分量