如何在 ruby 中反转顺序

问题描述 投票:0回答:7

如何用 Ruby 编写一个代码片段,以相反的顺序打印出 1 到 200 之间的每个 3 的倍数?

这是我到目前为止的代码:

(1..200).each do | i | ##loop it then
  if i % 3 == 0
ruby ruby-on-rails-3 ruby-on-rails-4
7个回答
7
投票

打印从 200 到 1 的三的倍数的最简单方法是使用

Integer#downto
:

200.downto(1) do |i|
  puts i if i % 3 == 0
end

与其他答案不同,它不需要将范围转换为数组或创建数组并反转它。


5
投票

您可能想要

#select
#reverse

puts (1..200).select { |i| i % 3 == 0 }.reverse

1
投票

Range
没有
#reverse
方法,但您可以调用
#to_a
返回这些数字的数组,然后在该数组上调用
#reverse_each
以相反的顺序迭代数字:

(1..200).to_a.reverse_each { |i| puts i if i % 3 == 0 }

有关更多信息,请参阅有关 RangeArray 的文档。


1
投票

这有效:

(1..200).to_a.reverse.each do |number|
  if number % 3 == 0
  puts number
  end
end

在这里,您指定从 1 到 200 的数字范围,将它们转换为数组,反转顺序并迭代每个元素以查看它是否可以被 3 整除(即,如果您将其除以 3,则它不应该余数),如果是,则打印该数字 :)

编辑:正如乔丹指出的,写作

reverse_each 

而不是

 reverse.each 

效率更高。


1
投票

OP 希望打印某个范围的某些元素。首先构造一个数组是低效的(但当然不一定是坏的)。我的答案和其他一些答案没有创建数组。

假设范围的形式为

first..last
。要以相反的顺序打印每个
multiple
元素,您可以编写:

def rev_n_skip(first, last, multiple)
  (first..last).step(multiple).reverse_each { |i| print "#{i} " }
  puts
end

rev_n_skip(1, 19, 3) #-> 19 16 13 10 7 4 1 
rev_n_skip(1, 18, 3) #-> 16 13 10 7 4 1 
rev_n_skip(1, 17, 3) #-> 16 13 10 7 4 1 
rev_n_skip(1, 16, 3) #-> 16 13 10 7 4 1 
rev_n_skip(1, 15, 3) #-> 13 10 7 4 1 

rev_n_skip(2, 19, 3) #-> 17 14 11 8 5 2 
rev_n_skip(2, 18, 3) #-> 17 14 11 8 5 2 
rev_n_skip(2, 17, 3) #-> 17 14 11 8 5 2 
rev_n_skip(2, 16, 3) #-> 14 11 8 5 2 
rev_n_skip(2, 15, 3) #-> 14 11 8 5 2 

0
投票

你可以尝试将值赋给变量a然后你可以:

a.reverse!
puts a

这也可能有帮助作为示例:

def reverse_string(string) # method reverse_string with parameter 'string'
  loop = string.length       # int loop is equal to the string's length
  word = ''                  # this is what we will use to output the reversed word
  while loop > 0             # while loop is greater than 0, subtract loop by 1 and add the string's index of loop to 'word'
    loop -= 1                  # subtract 1 from loop
    word += string[loop]       # add the index with the int loop to word
  end                        # end while loop
  return word                # return the reversed word
end                        # end the method

0
投票

其他三种不需要数组的方法是:

(1..200).reverse_each { |i| puts i if i % 3 == 0 }

或者:

(200..1).step(-1).each { |i| puts i if i % 3 == 0 }

并且:

200.step(1, -1).each { |i| puts i if i % 3 == 0 }
© www.soinside.com 2019 - 2024. All rights reserved.