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

