毕达哥拉斯三重在哈斯克尔没有对称的解决方案

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.一旦你有价值观ab,你可以简单地计算(a^2)+(b^2),并检查其是否具有天然的平方根.


Joh*_*ohn 5

根本不知道Haskell(也许你现在正在学习它?)但是如果你只能拿出那些a小于或等于的那个,你似乎可以摆脱它们b.这将摆脱重复.