/ / Haskell nekonečný zoznam Pytagorových trojok - haskell, rekurzia

Haskell nekonečný zoznam Pythagorova strojnásobuje - haskell, Rekurzia

Skúšal som túto otázku celé hodiny, stále som sa jej držal. Môže niekto pomôcť. Hľadáte návrhy:

Na definovanie funkcie použite zoznam trojnásobok n ktorá vráti zoznam trojitých kladných čísel (x, y, z) všetky menšie alebo rovné n, taký, že x ^ 2 + y ^ 2 = z ^ 2

Nevyrábajte duplikáty trojitých alebo trojitých, ktoré sú permutáciami už vyrobených trojitých.

odpovede:

1 pre odpoveď č. 1

Mal som nejaký kód, ktorý tento problém už rieši ...

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

Tento kód používa Strom primitívnych pytagorejských trojčiat. Nechám to preformátovať tak, aby používalo porozumenie zoznamu ako cvičenie pre čitateľa.


0 pre odpoveď č. 2

Môžete použiť nasledujúci kód:

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

a potom definujte:

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

V takom prípade je prvý prvok vždy väčší ako druhý.

Ak chcete, aby sa objednávali aj prvky n-tic, vyskúšajte:

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

Testovanie toho, či je číslo štvorcové, je pri prvej metóde dosť neefektívne, môžete ho však nahradiť touto:

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

0 pre odpoveď č. 3

Vyhovuje to návrhu zákona?

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