pid的递归示例
1.前言
1.1 递归的条件
究竟什么样的问题可以用递归来解决呢?只要同时满足以下三个条件,就可以用递归来解决:
-
一个问题的解可以分解为几个子问题的解,这些分解后的子问题,除了数据规模不同,求解思路完全一样
何为子问题?子问题就是数据规模更小的问题。在斐波那契数列中,就是求出前两个数之和
-
根据分解后的子问题,写出递归公式
在斐波那契数列中,就是 f(n) = f(n -1) + f(n -2)
-
存在递归终止条件
把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。在斐波那契数列中,存在多个终止条件,也就是 f(1) = 1 和 f(2) = 1,这就是递归的终止条件
1.2 如何编写递归代码
写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
public int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
2.测试
2.1示例
private List<MassByDeptVo> recur(List<MassByDeptVo> have, List<MassByDeptVo> all) {
List<MassByDeptVo> ret = Lists.newArrayList();
have.forEach(vo -> {
List<MassByDeptVo> collect = all.stream().filter(x -> Objects.equals(x.getPid(), vo.getDeptId())).collect(Collectors.toList());
if (collect.size() != 0) {
ret.addAll(recur(collect, all));
}
ret.add(vo);
});
return ret;
}
2.2实体类
@Data
public class MassByDeptVo implements Serializable {
@ApiModelProperty(value = "部门编号")
private Long deptId;
@ApiModelProperty(value = "父级部门编号")
private Long pid;
@ApiModelProperty(value = "是否有子级")
private Integer hasChild;
public MassByDeptVo() {
}
public MassByDeptVo(Long deptId, Long pid, Integer hasChild) {
this.deptId = deptId;
this.pid = pid;
this.hasChild = hasChild;
}
}
2.3测试代码
@Test
void queryMassNewDept() {
MassByDeptVo deptVo = new MassByDeptVo(25L, 87L, 1);
List<MassByDeptVo> all = Lists.newArrayList(
new MassByDeptVo(7L, 52L, 0),
new MassByDeptVo(20L, 52L, 1),
new MassByDeptVo(21L, 52L, 1),
new MassByDeptVo(22L, 52L, 1),
new MassByDeptVo(25L, 87L, 1),
new MassByDeptVo(26L, 25L, 0),
new MassByDeptVo(27L, 25L, 0),
new MassByDeptVo(28L, 25L, 0),
new MassByDeptVo(29L, 87L, 1),
new MassByDeptVo(30L, 87L, 0),
new MassByDeptVo(32L, 21L, 0),
new MassByDeptVo(33L, 21L, 0),
new MassByDeptVo(35L, 22L, 0),
new MassByDeptVo(36L, 22L, 0),
new MassByDeptVo(37L, 22L, 0),
new MassByDeptVo(38L, 22L, 0),
new MassByDeptVo(39L, 52L, 1),
new MassByDeptVo(40L, 39L, 1),
new MassByDeptVo(41L, 39L, 0),
new MassByDeptVo(42L, 52L, 1),
new MassByDeptVo(43L, 42L, 0),
new MassByDeptVo(44L, 87L, 1),
new MassByDeptVo(45L, 20L, 1),
new MassByDeptVo(46L, 44L, 0),
new MassByDeptVo(47L, 44L, 0),
new MassByDeptVo(48L, 44L, 0),
new MassByDeptVo(49L, 44L, 0),
new MassByDeptVo(50L, 29L, 0),
new MassByDeptVo(51L, 29L, 0),
new MassByDeptVo(52L, null, 1),
new MassByDeptVo(53L, 29L, 0),
new MassByDeptVo(54L, 25L, 0),
new MassByDeptVo(55L, 52L, 0),
new MassByDeptVo(56L, 52L, 1),
new MassByDeptVo(57L, 52L, 1),
new MassByDeptVo(58L, 52L, 0),
new MassByDeptVo(59L, 56L, 0),
new MassByDeptVo(62L, 57L, 1),
new MassByDeptVo(63L, 57L, 0),
new MassByDeptVo(64L, 57L, 1),
new MassByDeptVo(65L, 57L, 1),
new MassByDeptVo(66L, 62L, 0),
new MassByDeptVo(67L, 62L, 0),
new MassByDeptVo(68L, 64L, 0),
new MassByDeptVo(69L, 64L, 0),
new MassByDeptVo(70L, 56L, 0),
new MassByDeptVo(71L, 22L, 0),
new MassByDeptVo(72L, 62L, 0),
new MassByDeptVo(74L, 29L, 0),
new MassByDeptVo(75L, 29L, 0),
new MassByDeptVo(76L, 29L, 0),
new MassByDeptVo(77L, 29L, 0),
new MassByDeptVo(80L, 25L, 0),
new MassByDeptVo(82L, 25L, 0),
new MassByDeptVo(83L, 45L, 0),
new MassByDeptVo(84L, 45L, 0),
new MassByDeptVo(85L, 44L, 0),
new MassByDeptVo(86L, 44L, 0),
new MassByDeptVo(87L, 20L, 1),
new MassByDeptVo(88L, 25L, 0),
new MassByDeptVo(89L, 57L, 0),
new MassByDeptVo(90L, 40L, 0),
new MassByDeptVo(91L, 40L, 0),
new MassByDeptVo(92L, 40L, 0),
new MassByDeptVo(93L, 40L, 0),
new MassByDeptVo(94L, 65L, 0),
new MassByDeptVo(95L, 65L, 0),
new MassByDeptVo(96L, 57L, 0));
List<MassByDeptVo> list = recur(Lists.newArrayList(deptVo), all);
System.out.println();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结