arrays – 为正负n创建从0到n的数字数组

arrays – 为正负n创建从0到n的数字数组,第1张

概述给定n,我想创建一个从0到n的数组: 10.make_array #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 如果n为负数,它也应该有效: -10.make_array #=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10] 我已经编写了这段代码,但我认为我使它变得比必要的更复杂(它对负数不起作用): class Fixn 给定n,我想创建一个从0到n的数组:

10.make_array #=> [0,1,2,3,4,5,6,7,8,9,10]

如果n为负数,它也应该有效:

-10.make_array #=> [0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]

我已经编写了这段代码,但我认为我使它变得比必要的更复杂(它对负数不起作用):

class Fixnum  define_method(:make_array) do    my_array = []    self.times() do |count|      self.>(0)      my_array.push(count)    end    my_array.push(self)    my_array  endend

有没有更简单的方法或捷径做同样的事情,以及如何处理负数的任何建议?

解决方法 要支持负数,您可以使用 uptodownto以及条件:

(我在这里展示了一个独立的方法,而不是修补整数)

def make_array(n)  if n > 0    0.upto(n).to_a  else    0.downto(n).to_a  endend

上面创建了一个使用Enumerable#to_a转换为数组的枚举器.

您可能希望通过直接调用Array::new跳过中间对象(枚举器) – 它创建一个具有给定数量元素的数组:

n = 3Array.new(n) #=> [nil,nil,nil]

如果给出了一个块,它会将每个元素的索引传递给块,我们应该返回它的值.该索引实际上正是我们想要的,所以我们可以简单地返回它:

Array.new(n) { |i| i } #=> [0,2]

如您所见,Array.new(n)返回n个元素,但我们需要n 1,所以让我们解决这个问题:

Array.new(n + 1) { |i| i } #=> [0,3]

不幸的是,Array :: new不接受负面大小:

Array.new(-3) #=> negative array size (ArgumentError)

所以对于负数n,我们必须传递-n并返回-i:

n = -3Array.new(-n + 1) { |i| -i } #=> [0,-3]

作为一种方法:

def make_array(n)  if n > 0    Array.new(n + 1) { |i| i }  else    Array.new(-n + 1) { |i| -i }  endend

我们试着避免重复.

使用abs可以很容易地将n转换为正数:

3.abs  #=> 3-3.abs #=> 3

适用于我们的代码:

n = 3Array.new(n.abs + 1) { |i| i } #=> [0,3]n = -3Array.new(n.abs + 1) { |i| i } #=> [0,3]

对于块,我们可以使用ternary if

n = 3Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,3]n = -3Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,-3]

我们甚至可以通过使用宇宙飞船 *** 作符a< =>来删除该条件.湾它通过分别返回-1,0或1来确定a是否小于,等于或大于b.

更具体地,对于Fixnum#<=>,n = 0.如果n大于0,则返回0;如果n小于0,则返回-1:

3 <=> 0  #=> 1-3 <=> 0 #=> -1

我们可以在块中使用< =>的结果来将i乘以:

Array.new(n.abs + 1) { |i| i * (n <=> 0) }

这相当于i * 1(如果n> 0)或i * -1(如果n <0). (有第三个返回值:如果n等于0,则n< => 0返回0,但这无关紧要,因为在这种情况下,结果数组为[0],0 * 0仍然为0)

作为一种方法:

def make_array(n)  Array.new(n.abs + 1) { |i| i * (n <=> 0) }end

尽管它很短,但这种方法变得非常复杂,并且它的作用并不明显.因此,我更喜欢第一种方法(使用upto和downto的方法)因为它的简单性.

总结

以上是内存溢出为你收集整理的arrays – 为正负n创建从0到n的数字数组全部内容,希望文章能够帮你解决arrays – 为正负n创建从0到n的数字数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1284767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存