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

Haskell中移除勾股元组排列并实现内部降序排序

解决方案

要实现只返回按降序排列且无重复的勾股三元组,只需在列表推导式中添加约束元素大小关系的条件,从源头避免生成重复排列,同时保证三元组内部降序:

pytri :: Integer -> [(Integer, Integer, Integer)]
pytri n = [(a, b, c) | a <- [1..n], 
                        b <- [1..a], 
                        c <- [1..b], 
                        a^2 == b^2 + c^2]

关键调整说明

  • 约束a为三元组中的最大元素:b的取值范围被限制在1到a之间,c的取值范围限制在1到b之间,确保a >= b >= c,从根本上避免生成如(3,4,5)、(4,3,5)这类重复排列。
  • 勾股定理条件a^2 == b^2 + c^2配合大小约束,只会筛选出以最大元素为斜边的有效三元组,且内部自然按降序排列。

测试pytri 10会直接返回期望结果:[(5,4,3),(10,8,6)]。

如果更倾向于先生成所有可能再处理的方式(效率略低),也可以通过排序去重实现:

import Data.List (nub, sortBy)
import Data.Ord (Down(..), comparing)

pytri :: Integer -> [(Integer, Integer, Integer)]
pytri n = nub $ map (\(x,y,z) -> sortBy (comparing Down) (x,y,z)) 
                    [(a,b,c) | a <- [1..n], b <- [1..n], c <- [1..n], a^2 == b^2 + c^2]

该方法先生成所有符合勾股定理的三元组,对每个三元组按降序排序,最后用nub去重。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:12:38