递归回溯通过深度优先遍历与状态回退生成所有子集,位运算法利用2ⁿ种二进制掩码枚举每个元素的选/不选状态。

一、使用递归回溯构建子集
该方法通过深度优先遍历的方式,在每一步决策中选择将当前元素加入子集或不加入,从而枚举所有可能的组合。回溯过程确保状态可恢复,避免重复或遗漏。
1、定义一个空结果数组用于存储所有子集。
2、定义递归函数,接收当前索引位置和当前临时子集作为参数。
3、在每次调用时,先将当前临时子集的副本加入结果数组。
立即学习“PHP免费学习笔记(深入)”;
4、从当前索引开始遍历输入数组,对每个元素执行:将该元素加入临时子集,递归调用下一索引,再从临时子集末尾弹出该元素。
5、递归终止条件为当前索引超出数组长度。
二、基于位运算生成所有子集
利用n个元素的集合共有2ⁿ个子集这一性质,将每个整数0到2ⁿ−1视为一个二进制掩码,其每一位对应原数组中一个元素是否被选中。
1、计算输入数组长度n,并初始化循环变量i从0到(1
2、对每个i,创建一个空子集数组。
3、遍历j从0到n−1,检查i的第j位是否为1:若(i & (1 ,则将原数组中索引j处的元素加入当前子集。
4、将构造完成的子集加入总结果数组。
三、迭代法逐层扩展子集
从空集开始,每次读取原数组中的一个新元素,并将该元素添加到已有所有子集中,形成新的子集,逐步构建完整幂集。
1、初始化结果数组为包含一个空数组:[[]]。
2、遍历原数组的每个元素value。
3、获取当前结果数组的长度len,然后从索引0开始遍历至len−1。
4、对结果数组中第k个子集,复制它并追加value,得到新子集,再将其推入结果数组末尾。
5、遍历结束后,结果数组即包含全部2ⁿ个子集。
四、使用SplStack模拟回溯栈结构
借助PHP标准库中的SplStack实现显式栈操作,替代隐式函数调用栈,适用于需精细控制递归深度或避免深层递归导致栈溢出的场景。
1、初始化一个SplStack实例用于保存当前路径,以及一个普通数组保存结果。
2、压入起始状态:当前处理索引0与空栈。
3、进入while循环,当栈非空时,弹出顶部状态(index, currentSubset)。
4、将currentSubset的克隆加入结果数组。
5、若index小于原数组长度,则分别压入两个新状态:不选当前元素(index+1, currentSubset),和选当前元素(index+1, currentSubset+[arr[index]])。



















