递归求幂集代码base case返回值作用及[1,2,3]执行流程咨询
问题1解答
base case返回[[]]不只是占位符,它本身是空数组的正确幂集结果,也是整个递归逻辑的最小子问题解。
递归的核心逻辑是:包含前idx个元素的幂集 = 「包含前idx-1个元素的幂集」 + 「前idx-1个元素的每个子集都加上当前第idx个元素得到的新子集」。当idx < 0时,意味着我们在处理0个元素的空序列,它的幂集天然就只有空集这一个元素,也就是[[]],这个返回值是完全符合幂集定义的,不是随便设置的占位符。比如如果输入是空数组,这个base case会直接返回正确结果,不需要额外处理。
问题2解答
代码是顺序执行的,必须等subset = powerset(array, idx-1)这行的递归调用完全返回结果之后,才会执行后面的for循环,所以会先计算完[1,2]的幂集,再处理当前层的元素3。
我们以[1,2,3]为例,完整执行流程如下:
- 初始调用
powerset([1,2,3]),idx被默认赋值为2(对应元素3),需要先执行递归调用powerset([1,2,3], 1)获取前两个元素的幂集 - 进入
idx=1的调用层(对应元素2),需要先执行递归调用powerset([1,2,3], 0)获取前1个元素的幂集 - 进入
idx=0的调用层(对应元素1),需要先执行递归调用powerset([1,2,3], -1) - 进入base case
idx=-1,直接返回[[]] - 回到
idx=0层,拿到subset为[[]],执行for循环:- 循环长度为1,把
[] + [1] = [1]追加到subset中,subset变为[[], [1]],返回该结果
- 循环长度为1,把
- 回到
idx=1层,拿到subset为[[], [1]],执行for循环:- 循环长度为2,依次追加
[2]、[1,2],subset变为[[], [1], [2], [1,2]],返回该结果
- 循环长度为2,依次追加
- 回到最顶层
idx=2层,拿到subset为[[], [1], [2], [1,2]],执行for循环:- 循环长度为4,依次追加
[3]、[1,3]、[2,3]、[1,2,3],最终得到完整幂集返回
- 循环长度为4,依次追加
优化版本说明
你提到的优化版本逻辑和原代码完全一致,只是把递归逻辑拆分到了私有辅助函数_powerset中,对外暴露的接口更简洁,同时避免了原代码用可选参数控制递归层级的写法,可读性更好,也规避了默认参数可能带来的潜在风险。
内容的提问来源于stack exchange,提问作者Patrick_Chong
相关产品推荐
相关产品推荐

