6-7 为什么selected要remove掉selected的最后一个元素呢?

来源:7-7 递归控制_例题列出所有组合

北极猫_

2017-11-14

不是说好了要remove掉data.get(0)吗?..

写回答

2回答

ccmouse

2017-11-14

这段似乎剪辑有点问题,data.get(0)正好是selected里面的最后一个元素而已,这里做了个小优化。

原因data.get(0)是前面刚add进去,然后add完的递归调用我们要求做到保证没有side-effect,也就是没有改变selected里面的内容。于是在这里可以放心的去remove最后一个元素。最后再看我们的函数体,的确保证了seleced进入时的状态和返回时的状态一致

0
3
慕婉清4425275
老师,我发现递归一旦里面做的事情比较多,整个递归函数就很难理解了,很难套用归纳法那种思路去理解这件事情,不直观了,比如这道题求组合,当涉及到打印值的时候,这个有什么好的方法帮助理解吗?
2018-08-15
共3条回复

进击的中华田园犬

2019-11-30

还是不明白为什么

0
1
ccmouse
谢谢同学追问。我又仔细看了一遍,这段并没有问题。 关键在于,selected.remove(data.get(0))和selected.remove(selected.size()-1)至少想的是一回事,因为我们之前selected.add(data.get(0))就是把data.get(0)放到了selected的最后。 这里比较坑的是,selected.remove是一个重载函数,有remove(Object)和remove(int)两个方式: selected.remove(data.get(0)):data.get(0)是Integer类型,也就是Object类型,表明remove值为data.get(0)的元素。但这样在有重复数据的情况下会有问题。 selected.remove(selected.size()-1):这里selected.size()-1是int类型,remove(int i)表示remove掉下标为i的元素,因为我们之前刚把data.get(0)加到selected里面去,所以这里remove掉的就是我们加进去的。 另外,我们确保了递归调用返回之后,不会改变selected的值。 也就是combinations(...)前后,selected是不变的。当然在调用过程中它是变的。
2019-12-01
共1条回复

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程