You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:06:05