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:
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
并限制我们搜索 a
和 b
的“空间”,我将其作为练习。