You need to enable JavaScript to run this app. Python实现最大公约数(ggt)程序异常抛出问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Python实现最大公约数(ggt)程序异常抛出问题求助

代码存在的问题

  • 条件判断逻辑错误:你写的if (b) or (a)==0实际触发逻辑是「只要b不为0,或者a等于0」就抛异常。你传入(25,14)时b=14是非0值,自然每次调用直接触发异常,和你想要的「任意输入为0才抛异常」的逻辑完全相反,正确的初始校验条件应该是if a == 0 or b == 0。
  • 异常校验范围错误:你的需求是初始输入的两个数字任意为0才抛异常,但欧几里得算法的正常递归终止条件就是当b=0时返回a,你把递归过程中出现的b=0也纳入异常校验,就算改了条件也会导致递归到终止步直接抛错。
  • 语法错误:print (ggt(25,14)缺少右括号,运行会直接报语法错误。
  • 异常写法不规范:不需要嵌套Exception,直接抛出ValueError即可,也可以补充自定义报错信息。
  • 类型转换逻辑不合理:int()转换应该放在函数入口处对初始参数处理,避免传入非整数类型时,参数校验阶段就报错。

修正后的可运行代码

def ggt(a, b):
    # 仅对初始输入做非0校验,用属性标记是否为递归调用
    if not hasattr(ggt, '_is_recursive'):
        a = int(a)
        b = int(b)
        if a == 0 or b == 0:
            raise ValueError("输入的两个数字不能为0")
        ggt._is_recursive = True
    # 递归终止条件
    if b == 0:
        # 清除递归标记,避免多次调用时状态缓存出错
        delattr(ggt, '_is_recursive')
        return a
    return ggt(b, a % b)

print(ggt(25, 14))

效果验证

  • 传入含0的初始参数如ggt(0, 10)会抛出ValueError: 输入的两个数字不能为0,符合需求
  • 传入合法参数如ggt(25, 15)会返回最大公约数5,计算结果正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 15:36:09