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
1 Answer 1
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
-
\$\begingroup\$ Cool. I like that. I'm going to read up on Seq.unfold. \$\endgroup\$Davin Tryon– Davin Tryon2012年06月04日 18:29:26 +00:00Commented Jun 4, 2012 at 18:29
Explore related questions
See similar questions with these tags.