Python实现Project Euler p24排列时递归结束外层循环不继续问题求解
问题原因
你的代码存在两处核心逻辑错误:
- 可变对象引用错误:Python中列表是可变对象,
new_list = my_list不会创建新列表,只是给原列表绑定了新的别名,调用new_list.remove(i)会直接修改当前递归层乃至上层递归的原始列表,导致循环遍历的列表被提前清空,所以内层递归结束后上层没有剩余元素可以继续遍历。 - 缺少回溯逻辑:你移除当前元素递归处理子排列后,没有将元素放回原列表,无法生成其他分支的排列。
修正方案
你可以通过拆分「当前排列前缀」和「剩余可选元素」的方式实现全排列,避免修改原始遍历列表,同时补充回溯逻辑,修正后代码如下:
def perms(current_prefix, remaining_nums): # 剩余元素为空时,打印当前完整排列 if not remaining_nums: for num in current_prefix: print(num) return for idx in range(len(remaining_nums)): # 选中当前元素加入排列前缀 current_prefix.append(remaining_nums[idx]) # 生成移除当前元素后的新剩余列表(不修改原列表) new_remaining = remaining_nums[:idx] + remaining_nums[idx+1:] # 递归处理子排列 perms(current_prefix, new_remaining) # 回溯:移除刚加入的元素,准备遍历同层下一个元素 current_prefix.pop() my_list = [0,1,2] perms([], my_list)
效果说明
运行上述代码会按顺序输出所有全排列的单个元素,完全匹配你预期的输出格式,可直接扩展用于Project Euler第24题的排列计算场景。
内容的提问来源于stack exchange,提问作者Miles Black
相关产品推荐
相关产品推荐

