Метод, который возвращает первые 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]