2

ピタゴラスのトリプルの定義に従って、3 タプル メンバー (a、b、c) の無限リストを返す次の関数を作成しました: a^2 + b^2 = c^2。特定のタプル (a、b、c) が有効なピタゴラスのトリプルかどうかを確認できる必要があります。これを行う方法は、関数を使用してタプルの無限リストを生成し、このリストelemをチェックしたい 3 タプルと一緒に渡すことです。

ただし、これは、3 タプルが無限リストのメンバーと一致しても終了しません。

コード:

pythagoreanTriples::[(Integer, Integer, Integer)]
pythagoreanTriples = [(a, b, c) | a <- [2..], b <- [a+1..], 
                                  c <- [b+1..], a*a + b*b == c*c ]
main = do
print $ elem (30, 72, 78) (pythagoreanTriples)

上記の関数を修正して有限リストを生成しようとしたところ、ロジックが非常にうまく機能したため、ロジックが正しいことはわかっています。

pythagoreanTriples n = [(a, b, c) | a <- [2..n], b <- [a+1..n], 
                                    c <- [b+1..n], a*a + b*b == c*c ]

main = do
print $ elem (30, 72, 78) (pythagoreanTriples 100)

ただし、これは無限リストで行う必要があります。どうすればうまくいくか教えてください。ありがとう。

4

3 に答える 3

3

有限コードから始めて、

pythagoreanTriples n = [(a, b, c) | a <- [2..n], b <- [a+1..n], 
                                    c <- [b+1..n], a*a + b*b == c*c ]

1以上の任意のもので機能するようにするだけですn:

pythagoreanTriples   = [(a, b, c) | n <- [1..],
                                    a <- [2..n], b <- [a+1..n], 
                                    c <- [b+1..n], a*a + b*b == c*c ]

(ただし、これにより多くの重複が生成されます)。最初に最大の値を修正してから、そのようなものをc見つけ、a条件が成り立つようにしたいと思います。ba < b < c

                     = [(a, b, c) | n <- [1..],
                                    c <- [2..n], a <- [2..c-1], 
                                    b <- [a+1..c-1], a*a + b*b == c*c ]

しかし、今、私たちは何のためにそれを必要としていnますか? 私たちはしません:

pythagoreanTriples = [(a, b, c) | c <- [2..], a <- [2..c-1], 
                                  b <- [a+1..c-1], a*a + b*b == c*c ]

となることによって

GHCi> ピタゴラス数を 20 個取ります

[(3,4,5),(6,8,10),(5,12,13)​​,(9,12,15),(8,15,17),(12,16) ,20),(7,24,25),(15,20,25),
(10,24,26),(20,21,29),(18,24,30),(16,30,34 ),(21,28,35),(12,35,37),(15,36,39),(24
,32,40),(9,40,41),(27,36,45), (14,48,50),(30,40,50)]

( は無理数なa==bので、その場合はありえないsqrt(2))。

于 2014-11-16T18:41:12.477 に答える