采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
不是说好了要remove掉data.get(0)吗?..
这段似乎剪辑有点问题,data.get(0)正好是selected里面的最后一个元素而已,这里做了个小优化。
原因data.get(0)是前面刚add进去,然后add完的递归调用我们要求做到保证没有side-effect,也就是没有改变selected里面的内容。于是在这里可以放心的去remove最后一个元素。最后再看我们的函数体,的确保证了seleced进入时的状态和返回时的状态一致
非常感谢!
老师,“然后add完的递归调用我们要求做到保证没有side-effect,也就是没有改变selected里面的内容”,这个不是太理解。为什么没有改变selected的内容呢?因为selected在后面又传进下一次的递归中了,下一次又会在selected上面加值,所以selected的值应该是改变的。 这一段的递归感觉很难理解,无法用之前的数学归纳法来理解,还有就是感觉函数的定义不是太好理解,这个函数是在干什么呢?每个参数的值是什么意思呢?如果n是代表的要选的数,如果为n为零的化,应该直接打印空,为什么会打印selected?
老师,我发现递归一旦里面做的事情比较多,整个递归函数就很难理解了,很难套用归纳法那种思路去理解这件事情,不直观了,比如这道题求组合,当涉及到打印值的时候,这个有什么好的方法帮助理解吗?
还是不明白为什么
谢谢同学追问。我又仔细看了一遍,这段并没有问题。 关键在于,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是不变的。当然在调用过程中它是变的。
登录后可查看更多问答,登录/注册
为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招
1.2k 4
1.0k 9
1.1k 8
1.9k 7
1.3k 6