如何将打印全排列的三层循环Python函数改写为递归函数
递归实现排列打印函数方案
实现思路
你原来的固定三层循环只能处理长度为3的列表,递归版本可以适配任意长度的输入列表,核心逻辑如下:
- 用一个数组记录已经使用过的索引,避免重复选取同一位置的元素
- 每一层递归负责确定排列中一个位置的元素,选好后进入下一层递归选下一个位置的元素
- 当当前排列的长度等于原输入列表的长度时,说明已经完成一组有效排列,直接打印即可
- 每完成一个分支的递归后要做回溯,取消索引的使用标记,供其他排列分支使用
完整代码实现
def permute_recursive(L, current_perm=None, used_index=None): # 初始化参数,避免Python可变默认参数的异常问题 if current_perm is None: current_perm = [] if used_index is None: used_index = [] # 递归终止条件:当前排列长度等于原列表长度,打印结果 if len(current_perm) == len(L): print(' '.join(map(str, current_perm))) return # 遍历所有索引,选未使用的加入当前排列 for i in range(len(L)): if i not in used_index: # 标记当前索引已使用,加入排列 used_index.append(i) current_perm.append(L[i]) # 递归选下一个元素 permute_recursive(L, current_perm, used_index) # 回溯,撤销标记供其他分支使用 current_perm.pop() used_index.pop() # 测试调用 permute_recursive([1,2,3])
运行输出
和你原有三层循环实现的输出完全一致:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
内容的提问来源于stack exchange,提问作者jack gold
相关产品推荐
相关产品推荐

