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。有没有办法在最后删除空间?
答案 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
只会影响通常缓冲的输出流。