返回前 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

这两个值都是&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 根据 *** 礼仪,您最终应该接受对您有帮助的答案。【参考方案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 个奇数的方法的主要内容,如果未能解决你的问题,请参考以下文章

输入 10 个整数,将这 10 个数按升序排列,并且奇数在前偶数在后?

2020-05-22 — 习题训练二

2020-05-22 — 习题训练二

习题5-2 使用函数求奇数和 (15分)

习题5-2 使用函数求奇数和 (15分)

数组重新排序,使奇数位于偶数前(待续)