递归算法以及简单应用

递归算法

递归算法,是通过重复将问题分解为同类的子问题而解决问题的方法,它的表现形式一般为函数的自调用。在某些时候,可以使用递归的方式替代循环。

说简单点,递归的本质就是函数在自身代码中不断地调用自身的一种行为。

当然,在这个循环调用的过程中我们一定要设置一个临界值,当满足条件时就停止递归,否则无限制的调用下去就形成了一个死循环。

user story

市考试院要组建一场全市范围的考试,全市范围内大概有一百到两百数量的学校,简单的select选择操作过于繁琐,这里需要通过选择区县的方法来默认选择区县下属的所有学校。

如下图所示,页面上是一个三层的树形结构,用户点击市级或者区县级节点时,我期望得到的数据是其下属所有学校的ID存放到一个数组中。
在这里插入图片描述
因为用户点击的这个节点有可能是市级节点,也有可能是区县级节点或者直接点击学校节点,所以这里就可以用递归算法来实现。

// 三层机构树的数据结构大概是这样的:
var data = {
    
    
			 title: '保定市',
		     key: '100',
		     children: [
				{
    
    
					title: '竞秀区',
					key: '1001',
					children: [
						{
    
    
							title: '竞秀一中',
							key: '10011',
							isLeaf: true // isLeaf字段是指示当前节点是否为最下层节点
						},
						{
    
    
							title: '竞秀三中',
							key: '10013',
							isLeaf: true
						}
					]
				},
				{
    
    
					title: '莲池区',
					key: '1002',
					children: [
						{
    
    
							title: '保定一中',
							key: '10021',
							isLeaf: true
						},
						{
    
    
							title: '莲池二中',
							key: '10022',
							isLeaf: true
						}
					]
				}
			]
		};
// 当前选中的学校ID数组
var selectedSchoolIds = [];

// 选中节点的响应事件,参数e是当前选中节点及其下属节点的数据
function getSchoolIds(e){
    
    
	if(e.isLeaf){
    
    
		// 当前节点的isLeaf的值为true时说明当前节点是一个学校节点,需要将其加入到选中列表
		this.selectSchoolIds.push(e.key); 
		// 并且学校节点没有子节点,可以直接借宿递归
		return;
	}
	else
	{
    
    
		// 当前节点没有isLeaf或者isLeaf的值为false,说明当前节点是市级或者区县级节点
		// 但是程序这时候还不能确定是市级还是区县级节点,所以在这里进行递归再进行一次判断
		e.children.foreach((c) => {
    
    
			this.getSchoolIds(c);
		})
	}
}

猜你喜欢

转载自blog.csdn.net/Dominic_W/article/details/128033378