Ayuda con Ejercicio

Buenas Tardes a todos, primero quisiera informarles que yo no se nada de
programación pero reciente mente estoy intentando aprender un poco de
Ruby, por lo mismo estoy intentando responder unos ejercicios para poder
practicarlo, el problema que yo tengo y que quisiera que me ayudaran a
resolver es el siguiente:

El ejercicio que estoy intentando resolver consiste en hacer la suma de
Fibonacci que consiste en la adición de los dos términos anteriores.
Ejemplo para los 10 primeros términos: 1, 2, 3, 5, 8, 13, 21, 34, 55,
89...

El problema es que tiene que hacer la suma sin rebasar 4000000, que por
el momento esa parte si la he podido completar, lo que no se como hacer
y que quisiera que me pudieran ayudar o explicar como hacerlo, es que el
resultado consiste solamente en la suma de los resultados pero solo los
que son números pares y no se como hacerlo, el código con el que estuve
practicando e intentando es el siguiente:

a = 1
b = 2
stop = 3000000

(1...500).each do
  s = a + b
  a = b
  b = s
  break if a > stop
end

puts = a

Les Agradecería mucho su ayuda.
Gracias.

···

--
Posted via http://www.ruby-forum.com/.

¿Es esto correcto?

a = 1
b = 2
stop = 4000000

while a < stop - b
a, b = b, a + b
end

puts a

···

2008/11/19 Fernando Villafuerte <fernandovr@hemac.com.mx>:

Buenas Tardes a todos, primero quisiera informarles que yo no se nada de
programación pero reciente mente estoy intentando aprender un poco de
Ruby, por lo mismo estoy intentando responder unos ejercicios para poder
practicarlo, el problema que yo tengo y que quisiera que me ayudaran a
resolver es el siguiente:

El ejercicio que estoy intentando resolver consiste en hacer la suma de
Fibonacci que consiste en la adición de los dos términos anteriores.
Ejemplo para los 10 primeros términos: 1, 2, 3, 5, 8, 13, 21, 34, 55,
89...

El problema es que tiene que hacer la suma sin rebasar 4000000, que por
el momento esa parte si la he podido completar, lo que no se como hacer
y que quisiera que me pudieran ayudar o explicar como hacerlo, es que el
resultado consiste solamente en la suma de los resultados pero solo los
que son números pares y no se como hacerlo, el código con el que estuve
practicando e intentando es el siguiente:

a = 1
b = 2
stop = 3000000

(1...500).each do
s = a + b
a = b
b = s
break if a > stop
end

puts = a

Les Agradecería mucho su ayuda.
Gracias.
--
Posted via http://www.ruby-forum.com/\.

lo que no se como hacer... es que el
resultado consiste solamente en la suma de los resultados
pero solo los que son números pares...

Solo te hace falta agregar una variable para la suma, incrementandola
cuando el numero es par (al dividirlo en 2 el residuo es cero):

a = 1
b = 2
stop = 4_000_000

suma = 0

(1...500).each do
s = a + b
a = b
b = s

suma = suma + b if 0 == b.modulo(2)

break if a > stop
end

puts = suma

Este es uno de los ejercicios en el Projecto Euler

Muy buenos para la práctica. Animo.

CT

···

On Nov 19, 3:53 pm, Fernando Villafuerte <fernand...@hemac.com.mx> wrote:

Muchas Gracias por su ayuda, el ejemplo con el que pude completar el
ejercicio fue con el que me puso la ultima persona, solo que no me daba
el resultado correcto por que en la suma le faltaba el primer numero par
que era el (2), para eso solamente modifique los valores de a = 0 y el
valor de b = 1, nuevamente muchas gracias.

···

--
Posted via http://www.ruby-forum.com/.

For fun (no guarantee of accuracy, but works for 4_000_000)...

include Math
R = Math.sqrt(5) #radical
P = (1 + R) / 2 #phi
my_number = 4_000_000
#inverting my_number to see approximately where n sits for F(n)
max_inverted = (log((my_number - 0.5) * R) / log(P)).to_i
#adding up F(n) for 0 to n
even_sum = (0..max_inverted).inject do |s, i|
  #next line is for direct F(n)
  #the inversion above is the opposite of this
  fib = (((P**i) - (1-P)**i) / R).floor
  #see if it's even
  fib % 2 == 0 ? (s + fib) : s
end
p even_sum

...It would be interesting to see what ceilings (like 4_000_000) this fails for.

cheers,
Todd

···

On Thu, Nov 20, 2008 at 11:21 AM, <tirado.carlos@gmail.com> wrote:

On Nov 19, 3:53 pm, Fernando Villafuerte <fernand...@hemac.com.mx> > wrote:

lo que no se como hacer... es que el
resultado consiste solamente en la suma de los resultados
pero solo los que son números pares...

Solo te hace falta agregar una variable para la suma, incrementandola
cuando el numero es par (al dividirlo en 2 el residuo es cero):

a = 1
b = 2
stop = 4_000_000

suma = 0

(1...500).each do
  s = a + b
  a = b
  b = s

suma = suma + b if 0 == b.modulo(2)

  break if a > stop
end

puts = suma

Fernando,
El ejercicio del cual hablas es parte del web site: www.eulerorg.net, donde
se ofrece un largo numero de otros ejercicios interesantes. La siguiente is
mi solucion, aunque no la mejor, pero es otra manera.
Que te diviertas!

=begin
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.

=end

MAXSUM = 4000000

def fibo(previous_fibo, current_fibo,new_fibo,total)

  if new_fibo.remainder(2) == 0
    if new_fibo <= MAXSUM
        total = total + new_fibo
    else
       puts "Found it. It is: #{total}"
       exit
    end
  end

  new_fibo = previous_fibo + current_fibo
  previous_fibo = current_fibo
  current_fibo = new_fibo
  fibo(previous_fibo, new_fibo, new_fibo, total)

end

fibo(1,2,2,0)

···

On Sun, Nov 23, 2008 at 3:26 AM, Todd Benson <caduceass@gmail.com> wrote:

On Thu, Nov 20, 2008 at 11:21 AM, <tirado.carlos@gmail.com> wrote:
> On Nov 19, 3:53 pm, Fernando Villafuerte <fernand...@hemac.com.mx> > > wrote:
>> lo que no se como hacer... es que el
>> resultado consiste solamente en la suma de los resultados
>> pero solo los que son números pares...
>
> Solo te hace falta agregar una variable para la suma, incrementandola
> cuando el numero es par (al dividirlo en 2 el residuo es cero):
>
>> a = 1
>> b = 2
>> stop = 4_000_000
>
> suma = 0
>
>> (1...500).each do
>> s = a + b
>> a = b
>> b = s
>
> suma = suma + b if 0 == b.modulo(2)
>
>> break if a > stop
>> end
>
> puts = suma

For fun (no guarantee of accuracy, but works for 4_000_000)...

include Math
R = Math.sqrt(5) #radical
P = (1 + R) / 2 #phi
my_number = 4_000_000
#inverting my_number to see approximately where n sits for F(n)
max_inverted = (log((my_number - 0.5) * R) / log(P)).to_i
#adding up F(n) for 0 to n
even_sum = (0..max_inverted).inject do |s, i|
#next line is for direct F(n)
#the inversion above is the opposite of this
fib = (((P**i) - (1-P)**i) / R).floor
#see if it's even
fib % 2 == 0 ? (s + fib) : s
end
p even_sum

...It would be interesting to see what ceilings (like 4_000_000) this fails
for.

cheers,
Todd

--
Ruby Student

For fun (no guarantee of accuracy, but works for 4_000_000)...

include Math
R = Math.sqrt(5) #radical
P = (1 + R) / 2 #phi
my_number = 4_000_000
#inverting my_number to see approximately where n sits for F(n)
max_inverted = (log((my_number - 0.5) * R) / log(P)).to_i
#adding up F(n) for 0 to n
even_sum = (0..max_inverted).inject do |s, i|

When you do (max_inverted + 1) in the previous line, this works for 4_000_000.

#next line is for direct F(n)
#the inversion above is the opposite of this
fib = (((P**i) - (1-P)**i) / R).floor
#see if it's even
fib % 2 == 0 ? (s + fib) : s
end
p even_sum

...It would be interesting to see what ceilings (like 4_000_000) this fails for.

Revisiting old emails. Sorry for noise, but important to be concise.

Todd