递归算法的实现与注意点

  递归算法的定义:存在直接或间接调用自身的算法称之为递归算法,又称为自调用算法。使用递归算法可以使我们在有限的步骤完成较为复杂的运算。可以理解为把一个大问题分解成数个相同结构的小问题,然后通过这些小问题的运算得到需要的结果。下面以一个获取树形子节点的例子来进行分析讲解。
  首先我们分析一下,我们需要获取到所有的子节点,就需要不断的去判断,判断它是否还有子节点可以让我们去获取。如果不使用递归那么这根部无法完成下去,因为我们需要的是一个动态获取,每一个节点都有可能变化,有可能会多几个节点又或是少几个。不可能每次节点一变动就改代码吧。所以我们可以试着把它拆分一下。试想,我们要获取所有子节点,那么肯定需要拿到某一个节点去然后去判断它是否有子节点,如果有则获取。仔细想想就能发现根据一个节点去获取它的子节点适用于每一个节点。那么就可以使用递归来完成获取所有子节点的功能。我们只需要保证它每一次需要根据的是哪一个节点去获取子节点就行了。
  下面看一下代码:

//递归获取所有子节点的ID		nodeObj->某一节点
function findAllNodes(nodeObj) {
	//获取某一节点的所有子节点,没有子节点==undefined
	var nodeArr = nodeObj.children; 
	//判断是否有子节点
	if (nodeArr != undefined) {
		//循环每一个子节点
		for ( var i = 0; i < nodeArr.length; i++) {
			//把自节点的唯一标识ID拼接到全局变量nodeId中
			nodeId += "," + nodeArr[i].id;
			//相同等,也是判断是否有子节点
			if (nodeArr[i].children != undefined) {
				//递归(调用自己,传入当前遍历的这个节点对象)
				findAllNodes(nodeArr[i]);
			}
		}
	}
	//返回
	return nodeId;
}

  需要注意的是,我这里是使用全局变量来存储每一节点的唯一标识ID,所以我最后返回的是那个全局变量,它就包含了我所需要的数据。如果不用全局变量直接return返回的话那么你将有可得到空数据。因为递归的原理就堆栈一样,堆栈是一个先进后出的效果。也就是说不管你递归了多少次,他最后返回的都是第一次执行得到的数据。注意我说的是没用变量存储数据就直接返回的方式。除非没进行递归,第一次执行就得到了所有的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值