求遍历任意长度数组所有变体的算法,递归排列实现遇阻
数组全排列的递归实现方案
递归实现全排列的核心逻辑很直接:每次从剩余元素里选一个作为当前排列的下一个元素,然后递归处理剩下的元素,直到没有剩余元素时,就得到一个完整的排列。
实现思路
- 定义递归函数,参数包含当前已构建的排列和待处理的剩余元素
- 当剩余元素为空时,将当前排列存入结果集合
- 遍历剩余元素中的每一个:
- 把当前元素加入已构建排列
- 递归处理「剩余元素去掉当前元素」的新数组
- 回溯:将当前元素从已构建排列中移除,继续处理下一个元素
代码示例(Python)
def permute(nums): result = [] def backtrack(current, remaining): if not remaining: result.append(current.copy()) return for i in range(len(remaining)): # 选择当前元素 current.append(remaining[i]) # 递归处理剩余元素(排除当前选中的) backtrack(current, remaining[:i] + remaining[i+1:]) # 回溯,撤销选择 current.pop() backtrack([], nums) return result # 测试示例 arr = [1, 3, 5, 7] all_permutations = permute(arr) for p in all_permutations: print(p)
说明
- 这段代码会输出输入数组的所有排列,比如输入
[1,3,5,7]时,会包含你示例中的[1,3,7,5]、[1,5,3,7]等所有变体 - 如果数组包含重复元素,比如
[1,1,2],上面的代码会生成重复排列。要去重的话,可以在遍历剩余元素时,跳过和当前元素相同的已处理元素,比如加入判断if i > 0 and remaining[i] == remaining[i-1]: continue,不过前提是先对数组排序。
内容的提问来源于stack exchange,提问作者cherry_ds
相关产品推荐
相关产品推荐

