BLOG.QuelLENcode

Portrait

ソフトウェア・Linux・好きなモノ・日々のこと

 
 

[F#]C#erがProject EulerをF#で解いていくシリーズ –Problem 1-

4月 05 2011

こんにちは、兎音もざこと、Mozamimyです。
最近技術的な話題を書いていなかった(というより、ブログ自体放置気味)なので、たまには書いてみます。

ここ最近、わたしは関数型言語というものを知りました。CやC#、JavaなどのC言語の息のかかった言語しかまともに使ったことにないわたしにとって、関数型言語の世界は新しいものでした。

まず何よりも、関数型言語で遊んでいると、なにやら頭が良くなった気分に浸れるというのが大きなポイントです。科学技術計算に向いているというだけあって、ラムダ式やカリー化など、プログラミングを構成している要素が実に数学的。おもしろい。おもしろい。おもしろい。

関数型言語にはHaskellだのOCamlだのいろいろあるみたいですが、.NET好き+実用性+C#での経験が生かせるという点で、わたしは一言。「F#、きみにきめた!」

で、意気込んで入門サイトや入門書にあたろうとすると、日本語の文献が少ない少ない。入門サイトも少し物足りない感じ。新しい記法と古い記法が混じり合ってよくわからないことになってます。

さて困った、どうやって勉強しよう。考えたあげく、手をこまねいているくらいなら、実際に手を動かして、どう書けばいいかわからないところは調べながら手探りで勉強しようと思い、かの有名なProject Eulerの問題をF#で解いていこうと思い立ちました。

F#の熱が冷めてくるまでは、メモがてらProject Eulerの解答例をここにメモしていこうと思います。コメントとかでバンバンツッコンでくれたらうれしいなっ!

 

さて、さっそくProblem 1です。記念すべき1問目。Project Euler的にHello, Worldです∩_∩

[問題(英語)]
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.

Problem 1 - Project Euler

[問題(和訳)]

10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、これらの合計は 23 になる。

同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。

Problem 1 - PukiWiki

さて、これをF#で実装してみたのがこちらです。

// Problem 1 in Project Euler

(* 再帰を使ってゴリゴリゴリゴリ

   for文を使うと関数型っぽくない(なんとなく) *)

let rec Sum n =

    if (n = 0) then 0

    else

        if (n % 3 = 0) || (n % 5 = 0) then n + Sum(n – 1)

        else Sum(n – 1) in

// 1000未満の自然数なので、999から計算開始

let parameter = 1000;;

printfn “%d” (Sum (parameter – 1));;

実行結果

233168

続行するには何かキーを押してください…

F#では手続き型言語の流れをくんでいることもあり、for文を使うという選択肢もありましたが、あえて関数型言語っぽく(?)再帰を使ってみました。999からだんだんと降りていって、0になったら終わりと。最後にprintfnで計算結果を表示させておしまい。

F#のシンタックスが、「なんとなく数学っぽい」気がしてきませんか?わたしはしてきます。胸が厚くなります。

こんな感じで今日はおしまいです。空いた時間を見つけてちょこちょこ解いて、アップしていく予定です∩_∩