無限リストを使ってハスケルでピタゴラスのトリプルを生成したい。私のコードで何が問題になっています:無限リストを使ったHaskellのピタゴラスのトリプル
trojkaty = [(a,b,c) | a <- [1..], b <- [1..], c <- [1..], (a^2)+(b^2)==(c^2)]
無限リストを使ってハスケルでピタゴラスのトリプルを生成したい。私のコードで何が問題になっています:無限リストを使ったHaskellのピタゴラスのトリプル
trojkaty = [(a,b,c) | a <- [1..], b <- [1..], c <- [1..], (a^2)+(b^2)==(c^2)]
はc
の中間値でa
とb
ため上限を発現してみてください:
1つの代替の可能性は、c >= a >= b
ことを強制することです最後の状態をチェックする。完全を期すため
trojkaty :: [(Int, Int, Int)]
trojkaty = [(a,b,c) | c <- [2..], b <- [2..c-1], a <- [2..b-1], a^2 + b^2 == c^2]
main = do
print $ take 5 trojkaty
これは機能します!ありがとう! – Krzysiek
それもb=2
を試みる前に、これはa=1
とb=1
ためc
の無限に多くの値をしようとします。それ以外の場合は前に無限のすべての値リスト全体を強制する、
[(a,b,c) | c <- [1..], a <- [1..c], b <- [1..a], (a^2)+(b^2)==(c^2)]
、他の可能性は、異なる順序で可能性を試みる、いわゆる「対角線モナド」を使用することです。そこには、これを行うためのライブラリがいくつかあります。
(しかし、あなたが何をしようとしてために、受け入れ答えは、おそらく簡単に/非常に簡単です。)
楽しみのためだけに:
Prelude Data.Universe> filter (\(a, b, c) -> a^2+b^2 == c^2 && all (>0) [a,b,c]) universe
[(3,4,5),(4,3,5),(6,8,10),(8,6,10),(5,12,13),(12,5,13),(9,12,15),(12,9,15),...
これはuniverseパッケージが必要です。
最も効率的なコードではありません[線形代数を使用](http://en.wikipedia.org/wiki/Tree_of_primitive_Pythagorean_triples) –