0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HaskellでProjectEuler解いてみたら遅延評価の有り難みわかった

Last updated at Posted at 2024-12-16

今回解いたProjectEulerの問題は45番のこちら
三角数、五角数、六角数のうち40755の次に共通する数を求める問題。

わたしのコードはこちら!
三角数、五角数、六角数の無限リストを定義。
あるリストの第一要素を他の2つのリストの第一要素を比べて、どちらかよりも値が小さかったらそのリストを前に進め、前に進めたリスト・2つのリストに対してもう一回調べる、という再帰的なgetCommon関数を定義。説明が下手😭

45.hs
triangles :: [Int]
triangles = [n*(n + 1) `div` 2 | n <- [1..] ]

pentagonals :: [Int]
pentagonals = [n*(3*n - 1) `div` 2 | n <- [1..] ]

hexagonals :: [Int]
hexagonals = [n*(2*n - 1) | n <- [1..] ]

getCommon :: [Int] -> [Int] -> [Int] -> [Int]
getCommon (x:xs) (y:ys) (z:zs) 
    | x == y && y == z = x : getCommon xs ys zs
    | x < y = getCommon xs (y:ys) (z:zs)
    | y < z = getCommon (x:xs) ys (z:zs)
    | otherwise = getCommon (x:xs) (y:ys) zs

main :: IO ()
main = do
    let common = take 3 $ getCommon triangles pentagonals hexagonals
    print common

(ちなみに解答は1533776805)

=> [1,40755,1533776805]

必要な値が参照されたときに初めて計算されるという特徴 遅延評価を活かして、効率良く解を求められている!😳(他の言語だと無限リスト作れなかったり、全部計算する必要があるから計算効率が悪かったりする)
すごい!!!!個人的革命😳❤️‍🔥

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?