关于递归算法的提问?

来源:8-8 Java中的PriorityQueue

北斗神拳1984

2018-06-29

这是我在另外一门实战课程学习到的一个递归算法

//递归算法,算出子节点
private Set<Category> findChildCategory(Set<Category> categorySet,Integer categoryId){
   //缩小规模,算出没有子节点的情况,查询该分类id的分类
   Category category = categoryMapper.selectByPrimaryKey(categoryId);
   if (category!=null){
       categorySet.add(category);
   }
   //查找子节点,递归算法一定要有一个退出的条件
   //在该节点有子节点的情况下,调用它子节点的该方法,计算出子节点
   //先查询出有多少个子节点
   List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
   //再对所有子节点去调用该算法
   for (Category categoryItem:categoryList){
       findChildCategory(categorySet,categoryItem.getId());
   }
   return categorySet;
}

上面的注释是我自己的理解,在刘老师您的课中,好像没有讲过把集合作为参数的这种方法的递归,我有想过把这个集合的参数直接用方法体局部变量来做,但是又觉得这样会造成内存的问题,我又想想set是动态结构,不会立马分配内存,对于这种返回集合类型的递归,我到底应该如何去做才最合适呢?不管是学习您的数据结构课还是学习java编程,我都是个新手,还没有做完一个完整的项目,希望能给我多些指导。

写回答

1回答

liuyubobobo

2018-06-29

由于我不了解你的具体业务场景,所以没有非常细致的验证代码逻辑。如果我没有理解错,你的这个函数:findChildCategory 完全可以不设立返回值(其实在你的递归调用的过程中,你也没有使用返回值:))。在初始调用的时候,categorySet传的是引用,在递归结束以后,传到categorySet这个参数的那个容器中已经包含所有遍历后的元素了:)


这个方法是没有内存问题的:)原因也在于每次传参,categorySet传的是一个引用,而不会集合中的所有内容一次一次的复制:)


这个课程主要讲解的是经典数据结构的底层实现,你的这个问题属于典型的算法设计相关的问题。在我的课程:《玩转算法面试》中,包含和递归相关的更多算法设计问题。如果有兴趣可以参考。传送门:https://coding.imooc.com/class/82.html


加油!


0
2
liuyubobobo
回复
北斗神拳1984
谢谢老板支持:)加油!
2018-06-29
共2条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程