删除 haskell 中元组的排列

问题描述 投票:0回答:1

haskell 函数:我写的

pytri
是一个采用整数值 n 的推导式 作为输入并返回所有三元组 (a, b, c) 的列表,其中 a, b, c ≤ n 满足 勾股定理: a2 = b2 + c2:

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

但是,它包含这些三元组的所有排列,例如:

pytri 10 == [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]

但应该改为:

pytri 10 == [(5,4,3),(10,8,6)]

如何删除额外的排列并在内部按降序对它们进行排序?

haskell functional-programming tuples list-comprehension pythagorean
1个回答
0
投票

你应该进行对称性破缺。因为我们知道 bc 总是可以交换,所以我们用一个额外的约束来打破对称性,即 a≤b:

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

我们还可以轻松限制对

c
的搜索,从而提高效率:

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

我们可以采取额外的技巧来更有效地寻找

c
,我将其作为练习。

© www.soinside.com 2019 - 2024. All rights reserved.