/ /ハスケルピタゴラスのトリプルの無限リスト - haskell、再帰

ハスケルピタゴラスのトリプルの無限リスト - haskell、再帰

私はこの質問を何時間も試してきましたが、まだそれに固執しています。誰も助けることができます。提案を探している:

リストの理解を使って関数を定義する トリプルn 正の整数の三つ組のリストを返す (x、y、z) すべて以下 n、 そのような x ^ 2 + y ^ 2 = z ^ 2

既に作成されたトリプルの順列である重複トリプルまたはトリプルを生成しないでください。

回答:

回答№1は1

私はこの種の問題を既に解決しているコードをいくつか持っていました...

branchTriple = [
(a,b,c) -> (a - 2*b + 2*c, 2*a - b + 2*c, 2*a - 2*b + 3*c),
(a,b,c) -> (a + 2*b + 2*c, 2*a + b + 2*c, 2*a + 2*b + 3*c),
(a,b,c) -> (2*b - a + 2*c, b - 2*a + 2*c, 2*b - 2*a + 3*c)
]

primitiveTriples l = pt (3,4,5) where
pt x = x : concatMap pt (filter l $ map ($ x) branchTriple)
allTriples l = let
pt = primitiveTriples l
mtriple (a,b,c) n = (a*n, b*n, c*n)
multiples p = takeWhile l $ map (mtriple p) [1..]
in concatMap multiples pt

usage n = allTriples ((a,b,c) -> all (<= n) [a,b,c])

このコードでは、 原始ピタゴラスの三つ組の木。読者のための練習としてリスト内包表記を使用するように再フォーマットします。


回答№2の場合は0

次のコードを使用することができます:

isSquare x = x == head (dropWhile (< x) squares)
where squares = scanl1 (+) [1,3..]

次に定義する:

triples n = take n [(i,j,truncate (sqrt (fromIntegral (i*i+j*j) :: Double))) | i <- [1 ..], j <- [1 ..i-1], isSquare(i*i+j*j)]

この場合、最初の要素は常に2番目の要素よりも大きくなります。

タプルの要素を同様に並べ替えるには、次のようにしてください。

triples n = take n [(j,i,truncate (sqrt (fromIntegral (i*i+j*j) :: Double))) | i <- [1..], j <- [1..i-1], isSquare(i*i+j*j)]

数値が正方形であるかどうかをテストすることは、最初のメソッドでは非常に効率的ではありません。このメソッドで置き換えることができます。

isSquare x = let x" = truncate $ sqrt (fromIntegral x :: Double) in x"*x" == x

回答№3の場合は0

これは法案に合っていますか?

ghci> [(x,y,z) | z<-[1..], x<-[1..z], y<-[1..z], x^2+y^2==z^2, x<y ]
[(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),
....^Cinterrupted