组合递归调用的理解
来源:7-7 递归控制_例题列出所有组合

慕婉清4425275
2018-08-16
老师,列出所有组合的递归调用不是太理解,我看您之前回答的remove最后一个元素这个问题里面有些地方不太明白,“然后add完的递归调用我们要求做到保证没有side-effect,也就是没有改变selected里面的内容”,这个不是太理解。为什么没有改变selected的内容呢?因为selected在后面又传进下一次的递归中了,下一次又会在selected上面加值,所以selected的值应该是改变的。 这一段的递归感觉很难理解,当递归调用里面加了一些其他当动作之后,无法用之前的数学归纳法来很直观地理解,还有就是感觉函数的定义不是太好理解,这个函数是在干什么呢?每个参数的值是什么意思呢?如果n是代表的要选的数,如果为n为零的话,应该直接打印空,为什么会打印selected?selected代表的是什么呢?是每次选中的一组组合?但是整个函数又是要打印出所有组合,感觉很多东西揉在一起后这个递归调用就很难理解了。
老师,我发现递归一旦里面做的事情比较多,整个递归函数就很难理解了,很难套用归纳法那种思路去理解这件事情,不直观了,比如这道题求组合,当涉及到打印值的时候,这个有什么好的方法帮助理解吗?
1回答
-
ccmouse
2018-08-19
不能改变selected值,是指函数进去这个点和出来这个点,这两个点不能改变。在中间当然是可以变得。数学归纳法也是假设进去和出来两个点selected不变,就可以往后做推论。
参数多的话,我们就更要分清楚每个参数是干嘛的。一旦分清楚,很复杂的递归也无压力。比如这里其实你对参数的理解是正确的。selected是一个过去式,函数是说曾经select过那么一些数的情况下,在传入的数组中再选择n个数,我们会遍历其中所有的情况。
对于打印,其实我们不必太在意,函数的定义里面不需要考虑到打印。打印只是某些特定状态下我们顺手做的事。我们只是发现,当n为0时,恰巧selected里就是我们要的一个完整组合,于是把它打印出来。我们也完全可以不管n是不是0都打印,这样不影响整个递归流程,只是答案不对而已。
同学的这些问题很好,是对我的知识点的一些强化和补充。00
相似问题