递归算法的实战

背景
  1. 一般在什么样的场景下,会使用递归算法?
  2. 递归算法的固有写法是什么?
过程
  • 场景
  1. 组织机构这样的数据结构,一般就可以采用递归去写一些业务逻辑。
  2. 存在父节点子节点这样的数据结构,一般也可以采用递归算法写业务逻辑。
  3. 有上下关系,有父子关系,有层层嵌套的关系。都可以使用递归写,这样逻辑会更加简单。
  • 实例
    node实体

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class Node {
    
        private int id;
    
        private String name;
    
        private int status;
    
        private Node child;
    }
    

    test类

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes={AttachfileApplication.class})
    public class RecursionTest {
        Node node1 = Node.builder().id(1).status(5).build();
    
        @Before
        public void buildNodes() {
            Node node2 = Node.builder().id(2).status(6).build();
            Node node3 = Node.builder().id(3).status(7).build();
            Node node4 = Node.builder().id(4).status(7).build();
            Node node5 = Node.builder().id(5).status(7).build();
            Node node6 = Node.builder().id(6).status(7).build();
            Node node7 = Node.builder().id(7).status(7).build();
            node1.setChild(node2);
            node2.setChild(node3);
            node3.setChild(node4);
            node4.setChild(node5);
            node5.setChild(node6);
            node6.setChild(node7);
    
        }
    
        @Test
        public void testRecursion() {
            // 从node1开始向下寻找,找到status等于6的节点,并且把status等于6的所有子节点状态全部更新为8
            Node node = findStatusEqualSix(node1);
            // 更新node下子节点状态为8
            updateStatusEight(node.getChild());
            // 递归打印
            printNodes(node1);
        }
    
        private Node findStatusEqualSix(Node node) {
            // 找不到状态为6的节点。退出递归算法。
            if (null == node) return null;
            // 找到状态为6的节点了。 写业务逻辑。
            if (node.getStatus() == 6) return node;
            // 递归找
            return findStatusEqualSix(node.getChild());
        }
    
        /**
         * 三步走
         * 1.  找到条件,跳出递归
         * 2.  写业务逻辑
         * 3.  调用递归方法
         */
        private void updateStatusEight(Node node) {
            if (null == node) return;
            node.setStatus(8);
            updateStatusEight(node.getChild());
        }
    
        /**
         * 递归打印
         */
        private void printNodes(Node node) {
            if (null == node) return;
            System.out.println("id: " + node.getId() + "; " + "status: " + node.getStatus() + " ;");
            printNodes(node.getChild());
        }
    }
    

    测试结果

    id: 1; status: 5 ;
    id: 2; status: 6 ;
    id: 3; status: 8 ;
    id: 4; status: 8 ;
    id: 5; status: 8 ;
    id: 6; status: 8 ;
    id: 7; status: 8 ;
    
  • 固有写法分析 写递归算法都是三步走。

  1. 退出递归算法逻辑的代码。
  2. 业务逻辑处理过程。
  3. 调用递归方法。
小结
  1. 有一些场景中使用递归算法会非常简单。会增加代码的可阅读性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值