返回前n个奇数的方法

时间:2016-10-16 07:36:21

标签: arrays ruby loops while-loop

只是一个简单的问题 - 我可能会在这里忽略一些东西。

以下方法正确输出前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 个答案:

答案 0 :(得分:3)

让我们用n == 2做你的例子。

迭代1:array.length == 0。 迭代2:array.length == 1

这两个值均为< 2。现在,如果您将<更改为<=,那么您需要进行第3次迭代array.length == 2,因为在将新元素添加到数组之前检查。< / p>

由于您似乎对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

答案 1 :(得分:0)

我就是这样做的:

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]