Python递归实现列表按指定长度拆分的所有组合方案
实现思路
核心递归逻辑是按拆分规则逐段生成组合:
- 每一轮取当前拆分规则的第一个长度k,从剩余可选元素中选出所有大小为k的不重复组合
- 对每个选出的组合,将剩余元素和剩下的拆分规则传入下一层递归处理
- 递归终止条件:所有拆分规则都处理完成,返回空组合作为拼接基础
为了避免输入列表有重复元素时判断错误,我们基于索引处理组合生成,最后再映射回原列表的元素值。
最优递归代码实现
import itertools def get_combos(x, splits): # 内部递归函数,基于索引处理避免重复元素干扰 def recursive_helper(available_indices, remaining_splits): # 递归终止:没有需要拆分的段了 if not remaining_splits: return [[]] result = [] current_seg_length = remaining_splits[0] # 枚举所有长度符合要求的索引组合 for seg_indices in itertools.combinations(available_indices, current_seg_length): # 过滤得到剩余可选的索引 left_indices = [idx for idx in available_indices if idx not in seg_indices] # 递归处理剩余拆分 for sub_combos in recursive_helper(left_indices, remaining_splits[1:]): # 把索引转为原列表的元素,和后续结果拼接 current_seg = tuple(x[i] for i in seg_indices) result.append([current_seg] + sub_combos) return result return recursive_helper(list(range(len(x))), splits)
验证说明
测试示例输入:
if __name__ == "__main__": res = get_combos([0, 1, 2, 3], [1, 2, 1]) for item in res: print(item)
输出和题目给出的示例完全一致,共12组结果,符合要求。该实现的时间复杂度和所有合法组合的总数正相关,没有冗余计算,是最优的递归实现。
内容的提问来源于stack exchange,提问作者NiSi
相关产品推荐
相关产品推荐

