2015-03-20

Project Euler - Problema 2 en R

Title Continuamos con los problemas planteados en Project Euler.

Problema

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.

Cada nuevo término en la sucesión de Fibonacci se genera mediante la adición de los dos términos anteriores. Al comenzar con 1 y 2 , los primeros 10 términos serán:

1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , ...

De los términos de la sucesión de Fibonacci cuyos valores no superan los cuatro millones, hallar la suma de aquellos que son pares.

Solución

Creando nuestra función

fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = a + tmp
    }
    return(a)
}
x <- sapply(1:33, fib)
sum(x[x%%2 == 0]) 
Utilizamos el paquete numbers

require(numbers) # función Fibonacci 
x <- fibonacci(33, TRUE) # Secuencia de números Fibonacci. Ver notas.
even <- x%%2 == 0 # Par o impar
df <- data.frame(x, even)
sum(df[even == TRUE, ]$x)
# Con la función subset
sum(subset(df, even == TRUE)$x) 
# Empleando el paquete dplyr
require(dplyr)
filter(df, even == TRUE) %>% summarise(sum(x))
[1] 4613732

Notas

Creamos la secuencia de números Fibonacci de 34 hacia abajo pues fibonacci(34) es el primero en exceder los 4 millones: 5702887. Por tanto, no sería necesaria la condición < 4000000, pero la dejamos como referencias por si hubiéramos partido de un número Fibonacci mayor.

fibonacci(33)
[1] 3524578
fibonacci(34)
[1] 5702887

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos