In my journey to learn F#, I have recently discovered the Project Euler site, which is a wonderful collection of small algorithmic problems which you can solve in your favorite programming language.
This is the kind of excercise I needed to get my feet wet with F# after reading about it. So I started with the first two problems listed on the site.
They both deal with sequence of numbers. Having a procedural/object-oriented mindset, I have scratched my head a few times in order to find a declarative solution true to the spirit of a functional program. Everything has become clearer after I've dug some more into the F# Sequences.
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
This is my solution to it:
# light let test = 1 |> Seq.unfold (fun x -> Some(x, x+1)) |> Seq.takeWhile (fun x -> x < 1000) |> Seq.filter ( fun x -> x % 3 = 0 || x % 5 = 0) |> Seq.sum;;
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, ...
Find the sum of all the even-valued terms in the sequence which do not exceed four million.
Here follows my solution:
A few comments:
- Here I am using the
filtermethod defined on sequences to stop
the sequence itself at 4 million, therefore I can get by with plain integers. Normally you would want to use BigIntegers for sequences where you'd expect to need handling large numbers.
- One of my first attempts to this problem did not have the
Seq.filterpart. I only had the
takeWhilelike the following:
Unfortunately, this does not work since the
takeWhile will interrupt
the sequence as soon as it satisfies the first condition (
x % 2 = 0); in other words,
it yields a sequence consisting only of the value 0, which looked somehow
counterintuitive to me at first.
If you are also taking your first steps with F#, you might want to have a look to the best resources to learn it.