pid的递归示例

发布时间 2023-04-24 13:35:38作者: 南翔技校毕业后

1.前言

1.1 递归的条件

究竟什么样的问题可以用递归来解决呢?只要同时满足以下三个条件,就可以用递归来解决:

  1. 一个问题的解可以分解为几个子问题的解,这些分解后的子问题,除了数据规模不同,求解思路完全一样

    何为子问题?子问题就是数据规模更小的问题。在斐波那契数列中,就是求出前两个数之和

  2. 根据分解后的子问题,写出递归公式

    在斐波那契数列中,就是 f(n) = f(n -1) + f(n -2)

  3. 存在递归终止条件

    把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。在斐波那契数列中,存在多个终止条件,也就是 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();
}