Метод, который возвращает первые n нечетных чисел

Просто быстрый вопрос - я, наверное, что-то здесь упускаю.

Приведенный ниже метод правильно выводит первые 2 нечетных числа: [1,3]

Если я не ошибаюсь, разве я не хочу, чтобы длина массива в конечном итоге равнялась n? Насколько я понимаю, длина выведенного массива [1,3] равна 2, что также представляет первые n -многие шансы: 2.

Таким образом, сравнение в строке 6 теперь будет <=, а не <

Однако, если я сделаю это, first_n_odds(2) теперь будет равно [1,3,5], что дает мне первые три шанса. Что тут происходит?

Спасибо!

def first_n_odds(n)

   array = []
   current_number = 0

   while array.length < n
      if current_number % 2 == 1
         array << current_number
      end
      current_number += 1 
   end

   return array

end

puts first_n_odds(2)       # output is [1,3]

2 ответа

Решение

Давайте сделаем ваш пример с n == 2,

Итерация 1: array.length == 0, Итерация 2: array.length == 1,

Оба эти значения < 2, Теперь, если вы измените < в <=, у вас будет 3-я итерация, где array.length == 2 так как ваша проверка происходит перед добавлением нового элемента в массив.

Поскольку вы, кажется, довольно плохо знакомы с Ruby, вот несколько способов определить метод более идиоматическим способом:

# Mapping over a range
def first_n_odds_1(n)
  (0...n).map { |x| x * 2 + 1 }
end

# Mapping over an Enumerator
def first_n_odds_2(n)
  n.times.map { |x| x * 2 + 1}
end

# Using Numeric#step + Enumerable#take
def first_n_odds_3(n)
  1.step(Float::INFINITY, 2).take(n)
end

# A more explicit version of the previous method
def first_n_oods_4(n)
  1.step(by: 2, to: Float::INFINITY).take(n)
end

Вот как бы я это сделал:

def first_n_odds(n)
  (1..(2*n)).step(2).to_a
end

puts first_n_odds(10).inspect

Выход:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Другие вопросы по тегам