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)]
如何删除额外的排列并在内部按降序对它们进行排序?
你应该打破对称性。因为我们知道b和c总是可以交换,所以我们用一个额外的约束a≤b来打破对称性:
我们还可以轻松限制搜索
c
,提高效率:我们可以采取额外的技巧来更有效地寻找
c
并限制我们搜索的“空间”a
,b
我将其作为练习。