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

