JS递归简单理解及利用递归生成树结构

	//递归方法论
	//递归则是自己调用自己
	//!!!化归
	//----------函数本身要做一件事,`在这里插入代码片`调用一个函数即是要做一件事
	//----------自己调用自己,要做一件事情,就要先做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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值