棋盘上有64个正方形。每个广场都有以前的两倍。编写一个程序,显示:-每个正方形上有多少粒,和-谷物的总数。
我的代码在第一部分工作,但我在声明总数时遇到了问题。一些我缺少的基本类/方法声明。谢谢你的帮助。
class Grains
def square(n)
array_of_grains = []
(0..63).each {|x| array_of_grains << 2**x}
n = n-1
array_of_grains[n]
end
def total
array_of_grains.each {|x| sum += x }
end
end发布于 2014-11-10 23:01:57
这是一个元答案,结合了这里所有的好主意(到处都是!)使用您的类创建完整的解决方案。
class Grains
attr_accessor :array_of_grains
def initialize(n = 1)
@array_of_grains = 63.times.with_object([n]) { |i,a| a << 2 * a.last }
end
def square(n)
array_of_grains[n - 1]
end
def total
array_of_grains.reduce(:+)
end
end用法:
board = Grains.new
board.square(3) #=> 4
board.total #=> 18446744073709551615发布于 2014-11-10 22:25:19
这里有很多问题。
首先,array_of_grains是square的本地特性。它不存在于方法之外。如果您希望它是Grain实例上的实例变量,那么它需要是@array_of_grains。
其次,您的total方法会导致一个错误,因为它没有本地的array_of_grains变量来调用each。即使存在,sum也将是未定义的。您需要声明sum并将其初始值设置为0,或者只需使用inject(&:+),这是oldest Ruby tricks in the book中的一种。
第三,每次调用方法array_of_grains时都要重新构建整个square数组。您可以使用||=只计算该值一次。
您的方法应该如下所示:
def square(n)
@array_of_grains ||= (0..63).map {|x| 2 ** x }
@array_of_grains[n - 1]
end
def total
@array_of_grains.inject(&:+)
end您几乎可以通过在您的方法之上添加一个attr_accessor :array_of_grains来使您的代码工作,但是这仍然不能解决未定义sum的问题。
发布于 2014-11-10 22:48:12
这是写它的一种方式:
square = 63.times.with_object([1]) { |i,a| a << 2 * a.last }
#=> [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,
# 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152,
#...
# 2305843009213693952, 4611686018427387904, 9223372036854775808]以确定总数(我最初在问题中漏掉的):
total, square = 63.times.reduce([0,[1]]) do |(t,a),_|
v = 2 * a.last
[t + v, a << v]
end
total #=> 18446744073709551614
square #=> (as above)https://stackoverflow.com/questions/26854106
复制相似问题