zl程序教程

您现在的位置是:首页 >  后端

当前栏目

递归算法以及简单应用

算法应用递归 简单 以及
2023-09-27 14:22:11 时间

递归算法

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

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

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

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);
		})
	}
}