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

为何Python毕达哥拉斯三元组函数返回多元素列表?如何修正为单元素

解决特殊毕达哥拉斯三元组的重复结果问题

嘿,我来帮你搞清楚为什么会出现两个元素,以及怎么修改~

问题根源

你的代码里用了三层循环遍历a、b、c,而且a和b的范围都是从150开始,这就会导致重复匹配的情况:

  • 第一次匹配:a=200,b=375,c=425,满足a²+b²=c²和a+b+c=1000,于是把200加入列表
  • 第二次匹配:a=375,b=200,c=425,同样满足条件,于是把375也加入列表

这就是为什么你会得到[200,375]的原因;而添加c的时候两次都是425,因为不管a和b怎么交换,斜边c都是同一个值。

优化修改方案

我们可以从两个方面优化,既解决重复问题,又提升代码效率:

方案1:限制b的范围,避免重复遍历

让b的取值始终大于a(b > a),这样就不会出现a和b交换的重复情况。同时,我们可以利用a+b+c=1000直接计算c,去掉不必要的c循环,大幅提升效率:

def pythagorean(n):
    result = []
    for a in range(150, n-1):
        # 让b从a+1开始,确保b > a,避免重复
        for b in range(a+1, n):
            c = 1000 - a - b
            # 先判断c是正数,再验证毕达哥拉斯条件
            if c > 0 and c * c == a * a + b * b:
                result.append(a)
                # 找到唯一的三元组后直接退出循环,不用继续遍历
                break
        if result:
            break
    return result

print(pythagorean(500))  # 输出 [200]

方案2:直接返回第一个匹配结果(更简洁)

既然我们知道和为1000的特殊毕达哥拉斯三元组是唯一的,找到符合条件的a后可以直接返回,不用维护列表:

def pythagorean(n):
    for a in range(150, n-1):
        for b in range(a+1, n):
            c = 1000 - a - b
            if c > 0 and c * c == a * a + b * b:
                return a  # 直接返回找到的a

print(pythagorean(500))  # 输出 200

这两种方法都能让你得到单一的结果,同时代码运行效率也比原来的三层循环高很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:16:49