/ / Haskell lista infinita de triples pitagóricos - haskell, recursión

Haskell lista infinita de triples pitagóricos - haskell, recursión

He estado intentando esta pregunta durante horas, todavía atascada. Alguien puede ayudar. Buscando sugerencias:

Use una lista de comprensión para definir una función triples que devuelve una lista de triples enteros positivos (x, y, z) todo menor o igual que norte, tal que x ^ 2 + y ^ 2 = z ^ 2

No produzca triples duplicados o triples que sean permutaciones de triples ya producidos.

Respuestas

1 para la respuesta № 1

Ya tenía un código que resuelve este problema ...

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])

Este código utiliza el Árbol de trillizos pitagóricos primitivos. Dejaré volver a formatearlo para usar las comprensiones de listas como un ejercicio para el lector.


0 para la respuesta № 2

Puede utilizar el siguiente código:

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

y luego definir:

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)]

En este caso, el primer elemento siempre es más grande que el segundo.

Si desea que también se ordenen los elementos de las tuplas, intente:

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)]

Probar si un número es cuadrado es bastante ineficiente con el primer método, puede reemplazarlo con este:

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

0 para la respuesta № 3

¿Se ajusta esto a la factura?

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