返回前 n 个奇数的方法
Posted
技术标签:
【中文标题】返回前 n 个奇数的方法【英文标题】:Method that returns the first n odd numbers 【发布时间】:2017-02-25 08:28:30 【问题描述】:只是一个简单的问题——我可能在这里忽略了一些东西。
以下方法正确输出前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]
【问题讨论】:
是什么让你认为数组长度最终不是n
?
【参考方案1】:
让我们以n == 2
为例。
迭代 1:array.length == 0
。
迭代 2:array.length == 1
。
这两个值都是< 2
。现在,如果您将<
更改为<=
,您将在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
【讨论】:
(1..n).map |x| x * 2 + 1
错过了1
并且包括第 (n+1) 个奇数。
糟糕,是的。如您所见,我有许多不同的版本,我从 IRB 复制了一个错误的版本到这里。感谢您了解这一点。
这真是太棒了。谢谢你们两位指导我完成这件事!我开始学习 Ruby 已经有一个月了,非常感谢你们为我指明了正确的方向。
@Andy 根据 *** 礼仪,您最终应该接受对您有帮助的答案。【参考方案2】:
我会这样做:
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]
【讨论】:
你可以写p first_n_odds(10)
而不是puts first_n_odds(10).inspect
以上是关于返回前 n 个奇数的方法的主要内容,如果未能解决你的问题,请参考以下文章