请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于递归算法的提问?

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

//递归算法,算出子节点
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 17:54:54

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


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


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


加油!


0 回复 有任何疑惑可以回复我~
  • 提问者 北斗神拳1984 #1
    我试了一下确实不需要返回值,只需要传入的那个set参数即可。我没什么编程基础,看了您写的关于学习您课程的顺序,我刚刚学完您的数据结构的第八章,正在继续学习您的算法与数据结构,刚刚学完基础排序,里面有很多C++的细节我刚刚我可以略过,只需要理解算法,用java实现就可以了。虽然自己把之前八章的内容都跟着写了一遍,但是感觉很多又忘了很多,不过理解的东西还在,您的课程真的讲的很透彻,希望很快能进入到玩转算法面试的学习,您的4套课程我都购买了,很期待看看您那些用算法做得游戏是怎么编写的,我还是按照您推荐的顺序来学习。
    回复 有任何疑惑可以回复我~ 2018-06-29 18:29:00
  • liuyubobobo 回复 提问者 北斗神拳1984 #2
    谢谢老板支持:)加油!
    回复 有任何疑惑可以回复我~ 2018-06-29 18:34:00
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信