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

Python质因数分解程序结果异常求助:输出不符合预期

解决Python质因数分解的输出错误问题

我来帮你排查下代码里的问题,你得到错误输出主要是因为递归和循环的混用加上全局列表的副作用导致的,咱们一步步来分析和修正:

问题分析

  1. 递归与循环冲突:你的fact函数里同时用了while循环和递归调用fact(a)。当递归处理完子问题返回后,外层的while循环会继续递增i并执行后续逻辑,这就会导致同一个因数被重复添加到列表里。比如分解24时,递归已经处理完所有2和3,但外层循环还会继续跑,把已经处理过的因数又加一遍。
  2. 全局列表的隐患:你用了全局变量li来存储结果,递归调用时会不断往这个列表里加元素,而递归返回后外层循环的操作又会继续添加,很容易出现重复或多余的元素。

另外,你的is_prime函数逻辑虽然能工作,但可以优化——不需要循环到i本身,只需要循环到i的平方根就够了,这样能大幅提高判断质数的效率。

修正方案

方案1:纯循环实现(推荐,逻辑更直观)

我们用单一的循环来处理分解,避免递归带来的混乱,同时把结果列表放在函数内部,避免全局变量的副作用:

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只需要检查到平方根,且只检查奇数
    for j in range(3, int(n**0.5) + 1, 2):
        if n % j == 0:
            return False
    return True

def prime_factors(a):
    factors = [1]  # 初始化包含1
    i = 2
    while i <= a:
        if a % i == 0 and is_prime(i):
            factors.append(i)
            a = a // i  # 整除,保持整数类型
        else:
            i += 1
    return factors

# 调用测试
a = int(input())
print(prime_factors(a))

输入24时,输出就是预期的[1, 2, 2, 2, 3]。

方案2:纯递归实现(适合理解递归逻辑)

如果想用递归,我们可以把递归函数设计成返回当前分解的因数列表,避免全局变量,同时去掉循环:

def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for j in range(3, int(n**0.5) + 1, 2):
        if n % j == 0:
            return False
    return True

def prime_factors_recursive(a):
    if a == 1:
        return []
    # 找到第一个能整除a的质数
    for i in range(2, int(a**0.5) + 1):
        if a % i == 0 and is_prime(i):
            return [i] + prime_factors_recursive(a // i)
    # 如果a本身是质数,直接返回
    return [a]

# 调用测试
a = int(input())
result = [1] + prime_factors_recursive(a)
print(result)

这个版本同样能得到正确的输出,递归逻辑更清晰,也没有全局变量的问题。

内容的提问来源于stack exchange,提问作者krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:40:48