Sie*_*rra 5 haskell functional-programming
我必须在没有对称解决方案的Haskell中完成Pythagorean三重奏.我的尝试是:
terna :: Int -> [(Int,Int,Int)]
terna x = [(a,b,c)|a<-[1..x], b<-[1..x], c<-[1..x], (a^2)+(b^2) == (c^2)]
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
Main> terna 10
[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]
Run Code Online (Sandbox Code Playgroud)
如你所见,我得到了对称的解决方案,如:(3,4,5)(4,3,5).我需要摆脱它们,但我不知道如何.谁能帮我?
sep*_*p2k 13
每次复制时,您都有一个版本,其中a大于b,另一个版本的b大于a.所以如果你想确保你只得到其中一个,你只需要确保它们a总是等于或小于b或者反之亦然.
实现此目的的一种方法是将其添加为列表理解的条件.
另一种更有效的方法是将b生成器更改为b <- [1..a],因此它只生成b小于或等于的值a.
说到效率:根本不需要迭代c.一旦你有价值观a和b,你可以简单地计算(a^2)+(b^2),并检查其是否具有天然的平方根.