aprendiendo ( Erlang ).

viernes, 25 de noviembre de 2011

Proyecto Euler. Problema 2.

| 0 comentarios |

El problema siguiente es tomado del Proyecto Euler:

Calcular la suma de términos de Fibonacci cuyo elementos no excedan de 4.000.000 y sean pares.

-module(p2).
-export([descripcion/0, solucion/0, solucion/4, fibonacci/1]).

-define(DESCRIPCION, ["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."]).

descripcion() ->
    lists:foreach ( fun(X) ->
                            io:format("~p~n", [X])
                    end, 
                    ?DESCRIPCION).

solucion() ->
    solucion(1, fibonacci(1), 0, 4000000).

solucion(N, FibN, Solucion, Maximo) when FibN >= Maximo ->
    {N, FibN, Solucion};
solucion(N, FibN, Solucion, Maximo) when FibN rem 2 == 0 ->
    solucion(N+1, fibonacci(N+1), FibN+Solucion, Maximo);
solucion(N, _, Solucion, Maximo) ->
    solucion(N+1, fibonacci(N+1), Solucion, Maximo).

fibonacci ( N ) ->
    {Fib, _} = fibonacci(N, {1, 1}, {0, 1}),
    Fib.

fibonacci ( 0, _, Pair ) -> Pair;
fibonacci ( N, {Fib1, Fib2}, Pair ) when N rem 2 == 0 ->
    SquareFib1 = Fib1 * Fib1,
    fibonacci ( N div 2, { 2* Fib1 * Fib2 - SquareFib1, SquareFib1 + Fib2 * Fib2 }, Pair );
fibonacci(N, {FibA1, FibA2}=Pair, {FibB1, FibB2}) ->
    fibonacci ( N-1, Pair, { FibA1 * FibB2 + FibB1 * (FibA2 - FibA1), FibA1 * FibB1 + FibA2 * FibB2 } ).

1> c(p2). {ok,p2} 2> p2:descripcion(). "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." ok 3> p2:solucion(). {34,5702887,4613732}
La función fibonacci/1 me calcula el enésimo término de la serie de Fibonacci. La función solucion/4 retorna una tripleta con: un contador, último término Fibonacci calculado y un acumulador o solución.
Como veras en la solución he hecho uso de las guardas para controlar si el elemento de la serie Fibonacci es par o si se da el caso base. En caso de que el elemento de la serie sea par lo añadimos a la solución y calculamos el siguiente elemento.

Publicar un comentario

0 comentarios:

 
Licencia Creative Commons
Aprendiendo Erlang por Verdi se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.