函数程序设计实验四:列表练习(2) 晓风の个人博客

{-
称一个三元组(x,y,z)是毕达哥拉斯三元组,如果x*x + y*y == z*z。例如,(3,4,5), (4,3,5), (6,8,10)等。
请定义一个函数
triads :: Int -> [(Int, Int, Int)]
使得triads n 给出[1 .. n]中的毕达哥拉斯三元组,如
 > triads 5
 [(3,4,5),(4,3,5)]
 > triads 13
 [(3,4,5),(4,3,5),(5,12,13),(6,8,10),(8,6,10),(12,5,13)]
-}
triads :: Int -> [(Int, Int, Int)]
triads n=[(x,y,z)|x<-[1..n],y<-[1..n],z<-[1..n],x*x+y*y==z*z]

{-
以上结果中(3,4,5)和(4,3,5)实际上没有区别。请改进该函数,使得结果中不出现这种重复意义的三元组,实现函数
 triads2 :: Int -> [(Int, Int, Int)]
使得
 > triads2 5
 [(3,4,5)]
  > triads2 13
 [(3,4,5),(5,12,13),(6,8,10)]
-}
triads2 :: Int -> [(Int, Int, Int)]
triads2 n=[(x,y,z)|x<-[1..n],y<-[x..n],z<-[y..n],x*x+y*y==z*z]