在数组中使用公式和计数器

时间:2014-01-16 17:35:12

标签: ruby ruby-1.8.7

我拥有的是:

array.map!{
    |c| c*(y**(z-1))
    z=z+1
}

array包含

[10, 10, 10]

输出不是我想要的,它是

[2, 3, 4]

我希望z作为计数器运行,之前定义为1,y之前已定义。另外,16或36(取决于用户输入)

所以如果我用3 10s输入相同的数组。我希望array成为(当y为16时):

[10, 160, 2560]

2 个答案:

答案 0 :(得分:3)

有更多惯用的方法可以在ruby中实现这一点,例如:

y = 16
array = Array.new(3) { |i| 10*(y**i) }
# => [10, 160, 2560]

或者,如果内容并不总是常量10,则有:

y = 16
array = [10, 10, 10]
array.map!.with_index { |c, i| c*(y**i) }
# => [10, 160, 2560]

以上两个例子将索引留给了循环结构,这很好,因为你担心的事情要少一些。

答案 1 :(得分:1)

将其写为

z = 1; y =16
array = [10, 10, 10]
array.map { |c| z=z+1 ; c*(y**(z-2))  }
# => [10, 160, 2560]

使用Array#map,block返回每次迭代的最后一个表达式。在你的情况下它是z = z + 1。您的初始z1。因此,在您评估的第一个z = z+1中,它是2,下一次迭代再次增加1,因此z的值为3,在最后一次通过z变为4。所以最后你得到了新的数组[2, 3, 4]

一种Rubyish方式:

y = 16
3.times.map{|i| 10*y**i}  # => [10, 160, 2560]