Сейчас я могу придумать 4 способа достижения цели Фибоначчи!
- Использование стабильной лямбды:
puts 'Fibonacci Sequence in a Line: ', ->(a=1, b=0) { 10.times.collect { (a, b = b, a + b)[0] } }.call
Это оценивает 10 серий. Но если вы хотите получить номер пользователя:
puts 'Fibonacci Sequence in a Line: ', ->(a=1, b=0) { gets.to_i.times.collect { (a, b = b, a + b)[0] } }.call
- Используя метод
tap
:
[0, 1].tap { |a| 10.times { a.push(a[-1] + a[-2]) } }
- Использование метода
reduce / inject
:
(1..10).reduce([0, 1]) { |a| a.push(a.last(2).sum) }
или
10.times.reduce([0, 1]) { |a| a.push(a.last(2).sum) }
- Используя метод
each_with_object
или map.with_object
:
10.times.each_with_object([0, 1]) { |_, a| a.push(a.last(2).sum) }
Примечание. Если у вас нет Ruby 2.4+, у вас может не быть метода sum. В этом случае вы можете добавить два последних элемента с помощью ary[-2] + ary[-1]
или ary.last(2).reduce(:+)
.
Подходя к вашей проблеме:
Рассматривая члены в последовательности Фибоначчи, значения которых не превышают четырех миллионов, найдите сумму четных членов.
[0, 1].tap { |a| until (s = a.last(2).sum) > 4_000_000 do a.push(s) end }.select(&:even?).sum
Или (что не так здорово):
[0, 1].tap { |a| loop while a.push(a.last(2).sum)[-1] < 4_000_000 }.tap(&:pop).select(&:even?).sum
Выходы:
4613732
Надеюсь, это поможет!