背景
- 一般在什么样的场景下,会使用递归算法?
- 递归算法的固有写法是什么?
过程
- 场景
- 组织机构这样的数据结构,一般就可以采用递归去写一些业务逻辑。
- 存在父节点子节点这样的数据结构,一般也可以采用递归算法写业务逻辑。
- 有上下关系,有父子关系,有层层嵌套的关系。都可以使用递归写,这样逻辑会更加简单。
-
实例
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 ;
-
固有写法分析 写递归算法都是三步走。
- 退出递归算法逻辑的代码。
- 业务逻辑处理过程。
- 调用递归方法。
小结
- 有一些场景中使用递归算法会非常简单。会增加代码的可阅读性。