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
相关产品推荐
相关产品推荐

