lundi 1 mars 2010

Project Euler #2

#load "nums.cma";;
open Big_int;;

let rec fib a b = function
        | 0 -> a
        | 1 -> b
        | n when n > 1 -> fib b (add_big_int a b) (n - 1)
        | _ -> raise (Invalid_argument "");;

let rec fib_range n =
        let fn = fib zero_big_int unit_big_int n in
        if lt_big_int fn (big_int_of_string "4000000") then
                if eq_big_int 
                (mod_big_int fn (big_int_of_int 2)) 
                zero_big_int then
                        fn :: (fib_range (n + 1))
                else
                        zero_big_int :: fib_range (n + 1)
        else
                [];;

Printf.printf "%s\n" (string_of_big_int 
(List.fold_left (add_big_int) zero_big_int (fib_range 0)));;

Генерация списка по причинам детского восторга от fold, в принципе можно было сразу суммировать.

Aucun commentaire:

Enregistrer un commentaire