关于递归算法的提问?
来源: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回答
-
由于我不了解你的具体业务场景,所以没有非常细致的验证代码逻辑。如果我没有理解错,你的这个函数:findChildCategory 完全可以不设立返回值(其实在你的递归调用的过程中,你也没有使用返回值:))。在初始调用的时候,categorySet传的是引用,在递归结束以后,传到categorySet这个参数的那个容器中已经包含所有遍历后的元素了:)
这个方法是没有内存问题的:)原因也在于每次传参,categorySet传的是一个引用,而不会集合中的所有内容一次一次的复制:)
这个课程主要讲解的是经典数据结构的底层实现,你的这个问题属于典型的算法设计相关的问题。在我的课程:《玩转算法面试》中,包含和递归相关的更多算法设计问题。如果有兴趣可以参考。传送门:https://coding.imooc.com/class/82.html
加油!
022018-06-29
相似问题