Solving second problem for Project Euler Problem 2 is an interesting one.
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.
Challenge here is to generate a fibonacci sequence, which is the fib(n-1) + fib(n-2) formula. This generates a evaluation tree during recursion and becomes quite large when generating a large N fibonacci value, and stackoverflow happens. To tackle this problem in a more efficient way, we shouldn’t generate the number for N re-cursing backwards, but generate the number from summation forwards.
Here’s my first F# solution I came up with.
let initiniteFib = let rec fib1 n1 n2 = seq { yield n1 yield! fib1 n2 (n1+n2) } fib1 0I 1I let answer = initiniteFib |> Seq.takeWhile (fun x -> x < 4000000I) |> Seq.filter (fun x -> x % 2I = 0I) |> Seq.sum
Another way to solve the same problem, is using Seq.unfold.
let answer = Seq.unfold (fun (first, second) -> Some(second, (second, first+second))) (0I, 1I) |> Seq.takeWhile (fun x-> x < 4000000I) |> Seq.filter (fun x -> x % 2I = 0I) |> Seq.sum
If you have more interesting ways to solve this, please share.
Image may be NSFW.Clik here to view.
