Problem 2

2008年3月19日
1 分

今日は 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]