递归指的是方法或函数自身调用自身,适用于一个功能被重复使用,而每一次使用时的参数是由上次的结果来确定的情况。本文介绍了递归在实际工作场景中的应用。
以下是将一个多层结构数据转换成树形结构的实例,该实例能够很好的展示递归的使用方式。
数据
id
parentId
value
1
0
one
2
1
two
3
1
three
4
2
four
5
2
five
6
3
six
7
4
seven
8
4
eight
9
4
nine
10
5
ten
11
6
eleven
12
9
twelve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 { "id" : 1 , "value" : "one" , "nodes" : [ { "id" : 2 , "value" : "two" , "nodes" : [ { "id" : 4 , "value" : "four" , "nodes" : [ { "id" : 7 , "value" : "seven" , "nodes" : [ ] } , { "id" : 8 , "value" : "eight" , "nodes" : [ ] } , { "id" : 9 , "value" : "nine" , "nodes" : [ { "id" : 12 , "value" : "twelve" , "nodes" : [ ] } ] } ] } , { "id" : 5 , "value" : "five" , "nodes" : [ { "id" : 10 , "value" : "ten" , "nodes" : [ ] } ] } ] } , { "id" : 3 , "value" : "three" , "nodes" : [ { "id" : 6 , "value" : "six" , "nodes" : [ { "id" : 11 , "value" : "eleven" , "nodes" : [ ] } ] } ] } ] }
Java递归的实现 递归得到树形结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class Item { private Integer id; private Integer parentId; private String value; private List<Item> nodes; public Integer getId () { return id; } public void setId (Integer id) { this .id = id; } public Integer getParentId () { return parentId; } public void setParentId (Integer parentId) { this .parentId = parentId; } public String getValue () { return value; } public void setValue (String value) { this .value = value; } public List<Item> getNodes () { return nodes; } public void setNodes (List<Item> nodes) { this .nodes = nodes; } }
1 2 3 4 5 6 7 8 9 10 11 @Mapper public interface ItemMapper { @Select("select * from table where parentId = #{parentId:INTEGER}") List<Item> getSubItemsByParentId (Integer parentId) ; @Select("select id from table where parentId = #{parentId:INTEGER}") List<Integer> getSubItemIds (Integer parentId) ; @Select("select * from table where id = #{id:INTEGER}") Item getItemById (Integer id) ; }
1 2 3 4 5 6 7 public interface ItemService { Item getItemTree () ; List<Integer> getSubItemIds (Integer itemId) ; List<Integer> getParentItemIds (Integer itemId) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Service("itemService") public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper itemMapper; @Override public Item getItemTree () { Item rootItem = itemMapper.getItemById(1 ); setItemTree(1 , rootItem); return rootItem; } private void setItemTree (Integer itemId, Item item) { List<Item> subItems = itemMapper.getSubItemsByParentId(itemId); if (subItems != null && subItems.size() > 0 ) { for (Item subItem : subItems) { setItemTree(subItem.getId(), subItem); } item.setNodes(subItems); } } }
递归获取指定item所有父item ID的集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Service("itemService") public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper itemMapper; @Override public List<Integer> getParentItemIds (Integer itemId) { return getParentItemIds(itemId, new ArrayList <>()); } private List<Integer> getParentItemIds (Integer itemId, ArrayList<Integer> resultIds) { Item item = itemMapper.getItemById(itemId); if (item != null && item.getParentId() > 0 ) { resultIds.add(item.getParentId()); getParentItemIds(item.getParentId(), resultIds); } return resultIds; } }
递归获取指定item下所有子item ID的集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Service("itemService") public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper itemMapper; @Override public List<Integer> getSubItemIds (Integer itemId) { return getSubItemIds(itemId, new ArrayList <>()); } private List<Integer> getSubItemIds (Integer itemId, ArrayList<Integer> resultIds) { List<Integer> subItemIds = itemMapper.getSubItemIds(itemId); if (subItemIds != null && subItemIds.size() > 0 ) { resultIds.addAll(subItemIds); for (Integer subItemId : subItemIds) { getSubItemIds(subItemId, resultIds); } } return resultIds; } }