如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
{-
称一个三元组(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]