//递归方法论
//递归则是自己调用自己
//!!!化归
//----------函数本身要做一件事,`在这里插入代码片`调用一个函数即是要做一件事
//----------自己调用自己,要做一件事情,就要先做XXX
//------------如果要做某件事情就是将其转换为已经解决的问题
//1.假设已经完成了递归函数
// function func(){
// //...
// func()
// //...
// }
//2.找出转换点
//3.找出临界条件
// function func1(){
// if (临界条件){return }
// func1()
// }
//case1
//1,3,5,7,9
//求第N项 n项 = 2n+1
function func1(n){
if (n<0) throw new Error ("项数必须大于0")
if(n == 0) return 1 //临界条件
return func1(n-1)+2 //转换点
}
//console.log(func1(0))
//求前N项和 (2,7,15,26...) s(n) = s(n-1)+n
function sum (n){
if(n == 1) return 2
return sum(n-1)+3
}
function fun2(n){
if(n == 1) return 2
return fun2(n-1)+sum(n)
}
//console.log(fun2(4))
//递归生成树形结构
let data = [{ id: 1, name: "办公管理", pid: 0 },
{ id: 2, name: "请假申请", pid: 1 },
{ id: 3, name: "出差申请", pid: 1 },
{ id: 4, name: "请假记录", pid: 2 },
{ id: 5, name: "系统设置", pid: 0 },
{ id: 6, name: "权限管理", pid: 5 },
{ id: 7, name: "用户角色", pid: 6 },
{ id: 8, name: "菜单设置", pid: 6 },
];
function parentDeal(data,pid){
//声明返回数组
let returnArr = [];
data.forEach((item)=>{
if(item.pid === pid){
//除去最高层级的数据(id === 0)
returnArr.push(item)
//进入递归中处理
childrenDeal(data,item,item.id)
}
})
return returnArr;
}
function childrenDeal(arr,itemData,itemId){
//首先判断是否有子类 没有默认为空
itemData.children = itemData.children?itemData.children:[];
arr.forEach((item)=>{
//递归条件
if(item.pid === itemId){
//找到则追加至上层数据children中
itemData.children.push(item)
//不断递归查找子类直到找不到子类本次递归结束才进入parentDeal函数进行下一最高层级操作
childrenDeal(arr,item,item.id)
}
})
}
let resArr = parentDeal(data,0)
console.log(resArr)
JS递归简单理解及利用递归生成树结构
最新推荐文章于 2024-07-29 14:36:53 发布