【问题标题】:Method that returns the first n odd numbers返回前 n 个奇数的方法
【发布时间】: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

标签: arrays ruby loops while-loop


【解决方案1】:

让我们以n == 2 为例。

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

这两个值都是&lt; 2。现在,如果您将&lt; 更改为&lt;=,您将在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 根据 StackOverflow 礼仪,您最终应该接受对您有帮助的答案。
【解决方案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
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 2011-04-03
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多