Ruby while和if循环问题

时间:2017-07-27 08:40:44

标签: ruby

x = 16
while x != 1 do
  if x % 2 == 0
    x = x / 2
    print "#{x} "
  end
  break if x < 0
end

嗨,我从上面得到的结果是8 4 2 1。有没有办法在最后删除空间?

4 个答案:

答案 0 :(得分:5)

Rubys的主要特色之一就是它的美丽 - 当你使用一个阵列时,你可以将这个循环缩短为漂亮的衬里:

x = 16
arr = []

arr.push(x /= 2) while x.even?
puts arr.join(' ')
# => "8 4 2 1"

*正如sagarpandya82建议x.even?与使用x % 2 == 0相同,导致更易读的代码

答案 1 :(得分:4)

不要将值打印到循环中。将它们放入一个列表(array)然后,在循环之后,使用空格作为粘合剂join数组项。

<8 4 2 1>

输出结果为:

Array#join

正如@Bathsheba在评论中指出的那样,此解决方案使用额外的内存(数组)来存储值,并且对{{1}}的调用也会生成一个字符串,使内存需求翻倍。对于小型列表而言,这不是问题,但需要考虑列表变得非常大。

答案 2 :(得分:3)

loop.reduce([[], 16]) do |(acc, val), _|
  break acc if val <= 1

  acc << val / 2 if val.even?
  [acc, val / 2]
end.join ' '

答案 3 :(得分:0)

if x != 0
    print " "
end

是一种方法,已经从其他print删除了后缀空格。 I / O永远是性能瓶颈;额外的if对性能的影响可以忽略不计,额外的print只会影响通常缓冲的输出流。