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