Magicode logo
Magicode
0

【フィボナッチ数】一緒に考えませんか? #Project Euler

2 min read

問1

1000以下の3または5の倍数の和を求める

Project Euler

考え方

-- | 1000以下の3または5の倍数の和を計算する

solve :: Int
-- まずは中間構造を考える
-- 必要な値をリストでもってsumをとることにする
solve = sum [1000以下の3の倍数または5の倍数の整数]

-- 内包表記でうまく出来そう
solve = sum [ n | n <- [1..1000], n `mod` 3 == 0 || n `mod` 5 == 0]


-- | リストを用いず単純な計算をする

solve2 :: Int
solve2 = 3の倍数の和 + 5の倍数の和 - 15の倍数の和

-- | 和の公式 Σ (1 → k) nk
sigma :: Int -> Int -> Int
sigma n k = n * k*(1 + k) / 2

-- | 1000の場合の一般化
sigma_1000 :: Int -> Int
sigma_1000 n = sigma n (1000 `div` n)

-- solve2を書き直すと
solve2 = sigma_1000 3 + sigma_1000 5 - sigma_1000 15


4613732

末筆ながら

ご意見求む!!

回答1の方が直感的に分かりやすい気がするけど、回答2の方が(完全に)優れてる?

回答1のリスト内包表記で条件部分(modらへん)でもっとおしゃれな書き方がありそう

Haskellerさんへ

計算量, 見やすさ, 文化的な観点から見て改善点や他回答があればぜひ!

スキル指標

実務1年程度のへっぽこプログラマーなので暖かくも厳しく見守ってください

読んだ本

  • すごいH本
  • 関数プログラミング実践入門 (途中)

つまり構文を知った程度で、関数型言語っぽい書き方を学び中です

Discussion

コメントにはログインが必要です。