递归
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归的运用
系统中总会有菜单和权限的操作,会出现无限层级的操作,就需要用到递归
。运用其调用自身
的特性,实现无限层级迭代,通过父子节点展示数据。
递归的实例操作
以查询所有菜单为例
数据结构
字段 | 名称 |
---|---|
id | ID |
fatherId | 父ID |
name | 名称 |
…… | …… |
/*
* File:Menus.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2021
* Date:2021/03/16 14:12:16
*/package com.ichochy.entity;
import java.util.List;
public class Menu {
private int id;
private int fatherId;
private String name;
private List
数据查询
【Java 递归实例操作-查询层级菜单】通过 fatherId 查询子菜单信息
/**
* 查询菜单信息-模拟方法
* @param fatherId
* @return
*/
publicList
没有建表查库,写个模拟方法
递归方法
/*
* File:Recursion.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2021
* Date:2021/03/16 14:07:16
*/package com.ichochy.recursion;
import com.ichochy.entity.Menu;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Recursion {/**
* 获取菜单
* @param fatherId
* @return
*/
publicList getAllMenus(int fatherId) {
List menus = getMenuByFatherId(fatherId);
for (Menu menu : menus) {
fatherId = menu.getId();
//自己调用自己
List childMenus = getAllMenus(fatherId);
//跳出递归
if (childMenus.isEmpty()) {
continue;
}
menu.setChilds(childMenus);
}
return menus;
}
构成递归需具备的条件:
- 子类问题与父类问题相同
- 不能无限制地调用自身,须有跳出出口,边界返回
[
{
”id“: 1,
”fatherId“: 15,
”name“: ”menu-15-1“
},
{
”id“: 2,
”fatherId“: 15,
”name“: ”menu-15-2“,
”childs“: [
{
”id“: 1,
”fatherId“: 2,
”name“: ”menu-2-1“
}
]
},
{
”id“: 3,
”fatherId“: 15,
”name“: ”menu-15-3“,
”childs“: [
{
”id“: 1,
”fatherId“: 3,
”name“: ”menu-3-1“
}
]
},
{
”id“: 4,
”fatherId“: 15,
”name“: ”menu-15-4“,
”childs“: [
{
”id“: 1,
”fatherId“: 4,
”name“: ”menu-4-1“
},
{
”id“: 2,
”fatherId“: 4,
”name“: ”menu-4-2“,
”childs“: [
{
”id“: 1,
”fatherId“: 2,
”name“: ”menu-2-1“
}
]
},
{
”id“: 3,
”fatherId“: 4,
”name“: ”menu-4-3“,
”childs“: [
{
”id“: 1,
”fatherId“: 3,
”name“: ”menu-3-1“
}
]
}
]
}
]
相关文章
- Java JSON数据实战操作 2020/10/10
- Java 正则表达式实例操作 2020/08/28
- Java 方法代理实例操作,静态代理、JDK动态代理、CGLIB动态代理 2020/08/24
- Java 反射实例操作 2020/08/23
- Java 中的重写(Override)与重载(Overload) 2020/08/20
推荐阅读
- 面试官竟然问我消息队列为啥会丢失消息(幸亏我总结了全套八股文)
- RocketMQ 消息发送设计和原理详解 源码剖析
- 面试|基于SSM框架的管理系统【完整项目源码】
- 【Java面试】TCP协议为什么要设计三次握手()
- java|linux开放指定端口命令
- java|jsp标签
- java|浅谈权限管理的设计与实现
- 零基础学好JAVASE|零基础带你学好JavaSE-抽象类和接口
- Java|权限系统控制到按钮级别开源推荐 Spring Boot-Shiro-Vue