Sign up ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I'm just starting to experiment with F# (from a C# background). I think I'm starting to get into the right way of thinking, but this code still seems pretty awkward. Is there a better (more terse) way to accoAny comments appreciated. (BTW, this is supposed to sum all even fibonacci numbers up to 4,000,000)

let rec fib x y max acc =
    let z = x + y
    if z < max then
        if z%2=0 then
            fib y z max (z + acc)
        else
            fib y z max acc
    else
        acc


let result = fib 1 2 4000000 2

printfn "%d" result
share|improve this question

1 Answer 1

up vote 3 down vote accepted

I think the solution reads better if you separate concerns a bit more instead of rolling it all into one mega function.

For instance, with these helper functions (that each do one—and only one—thing):

let fib =
  Seq.unfold
    (fun (cur, next) -> Some(cur, (next, cur + next)))
    (0I, 1I)

let isEven n = n % 2I = 0I

you can express the solution at a high level (almost at the level you would explain it in words!):

fib                                        //given the set of fibonacci numbers
|> Seq.filter isEven                       //take those that are even
|> Seq.takeWhile (fun n -> n <= 4000000I)  //not exceeding 4,000,000
|> Seq.sum                                 //and sum them
share|improve this answer
    
Cool. I like that. I'm going to read up on Seq.unfold. –  Davin Tryon Jun 4 '12 at 18:29

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.