Problem 2
今日は Problem 2。フィボナッチ数列のうち4,000,000以下で偶数のみを合計せよ,という問題。
cf. http://projecteuler.net/index.php?section=problems&id=2
Haskell ではやってる人がいるので,OCaml でやってみた。
let fibs_under_n n =
let rec fibs a b x =
let c = a + b in
if c > x then [] else c :: fibs b c x
in
1 :: 2 :: fibs 1 2 n
let even n = if n mod 2 = 0 then true else false
let sum lis = List.fold_left (+) 0 lis
let euler002 n = sum (List.filter even (fibs_under_n n))
let () = print_int (euler002 4000000)
even とか sum とかありそうな関数なんだけど,マニュアル見ても見つからなかったから自分で定義した。
コンパイルして実行:
^o^ >ocamlc -o euler002.exe euler002.ml
^o^ >euler002
4613732
追記:
_さんに教えてもらった方法で。
# let fibs_under_n2 n =
let rec fibs a b x =
let c = 4 * b + a in
if c > x then [] else c :: fibs b c x
in
2 :: 8 :: fibs 2 8 n
;;
# fibs_under_n2 5000;;
- : int list = [2; 8; 34; 144; 610; 2584]
元の関数を使うと
# List.filter even (fibs_under_n 5000);;
- : int list = [2; 8; 34; 144; 610; 2584]
