请稍等 ...
×

采纳答案成功!

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

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

正在回答

2回答

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 北极猫_ #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-11-15 09:02:08
  • 老师,“然后add完的递归调用我们要求做到保证没有side-effect,也就是没有改变selected里面的内容”,这个不是太理解。为什么没有改变selected的内容呢?因为selected在后面又传进下一次的递归中了,下一次又会在selected上面加值,所以selected的值应该是改变的。
    这一段的递归感觉很难理解,无法用之前的数学归纳法来理解,还有就是感觉函数的定义不是太好理解,这个函数是在干什么呢?每个参数的值是什么意思呢?如果n是代表的要选的数,如果为n为零的化,应该直接打印空,为什么会打印selected?
    回复 有任何疑惑可以回复我~ 2018-08-15 22:22:28
  • 老师,我发现递归一旦里面做的事情比较多,整个递归函数就很难理解了,很难套用归纳法那种思路去理解这件事情,不直观了,比如这道题求组合,当涉及到打印值的时候,这个有什么好的方法帮助理解吗?
    回复 有任何疑惑可以回复我~ 2018-08-15 23:34:16
进击的中华田园犬 2019-11-30 11:19:25

还是不明白为什么

0 回复 有任何疑惑可以回复我~
  • ccmouse #1
    谢谢同学追问。我又仔细看了一遍,这段并没有问题。
    
    关键在于,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 21:05:26
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信