Problem Statement
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
Solutions
Recursive Solution:
// Recursive solution | |
let eulerProblem2Answer'' = | |
let maxF = 4000000 | |
let rec computeSum f1 f2 sum = | |
match f1 + f2 with | |
| n -> computeSum f2 n sum | |
| n when n%2 = 0 -> if (n<maxF) then (computeSum f2 n (sum+n)) else sum | |
computeSum 0 1 0 |
Using infinite Fibonacci sequence:
let eulerProblem2Answer = | |
(0,1) | |
|> Seq.unfold (fun (f1,f2) -> Some(f2, (f2, f1+f2))) // Fibonacci Sequence | |
|> Seq.takeWhile(fun x -> x < 4000000) // Taking upto Max Fibbonacci | |
|> Seq.filter (fun x -> x%2=0) // Filtering only even numbers | |
|> Seq.sum // computing sum |
A bit shorter version can be derived using Seq.SumBy
:
let eulerProblem2Answer' = | |
(0,1) | |
|> Seq.unfold (fun (f1,f2) -> Some(f2, (f2, f1+f2))) | |
|> Seq.takeWhile(fun x -> x < 4000000) | |
|> Seq.sumBy (fun x -> if (x%2)=0 then x else 0) // using SumBy with a projection |
Result
> val eulerProblem2Answer : int = 4613732 val eulerProblem2Answer' : int = 4613732 val eulerProblem2Answer'' : int = 4613732