只是一个简单的问题 - 我可能会在这里忽略一些东西。
以下方法正确输出前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]
答案 0 :(得分:3)
让我们用n == 2
做你的例子。
迭代1:array.length == 0
。
迭代2:array.length == 1
。
这两个值均为 由于您似乎对Ruby很新,以下是一些以更惯用的方式定义方法的方法:< 2
。现在,如果您将<
更改为<=
,那么您需要进行第3次迭代array.length == 2
,因为在将新元素添加到数组之前检查。< / p>
# 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]