HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Euler 2 : Simple Fibonacci

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
simpleeulerfibonacci

Problem

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

Solution

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  Seq.sum                                 //and sum them

Code Snippets

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

let isEven n = n % 2I = 0I
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

Context

StackExchange Code Review Q#12235, answer score: 3

Revisions (0)

No revisions yet.