はじめてのF#
関数型プログラミングが面白そうだったのでF#を試してみることにしました。
資料が少ないので、とりあえずmsdnの記事を参考にしています。
一通り読んだところで(理解は出来ていませんが)Project Euler の Problem 1 に挑戦してみました。
10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。
同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。
試行錯誤の末、最初にコンパイルが通ったのが以下のコード。再帰バージョンです。
1 2 3 4 5 6 7 8 | printfn "Problem 1" let rec Problem1 x total = if x = 0 then total elif x % 3 = 0 || x % 5 = 0 then Problem1 (x-1) (total+x) else Problem1 (x-1) total printfn "> %d" (Problem1 999 0) |
もうちょっと短くしたいと思って書いたのが以下のコード。リストバージョンです。
1 2 3 4 5 6 7 8 9 10 | printfn "Problem 1" (* let rec Problem1 x total = if x = 0 then total elif x % 3 = 0 || x % 5 = 0 then Problem1 (x-1) (total+x) else Problem1 (x-1) total printfn "> %d" (Problem1 999 0) *) printfn "> %d" ([1..999] |> List.filter (fun a -> a%3=0 || a%5=0) |> List.sum) |
List.filterやList.sumの使い方が合っているか分からないのですが、一応答えは求められています。
比較用:C#で解いたもの
投稿時に気づきました。
CodeColorer(ソースコードのハイライト用ツール)がF#に対応していない・・・。

rei@sikios.com
コメントはまだありません。