首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石版“棋盘上的小麦粒”

红宝石版“棋盘上的小麦粒”
EN

Stack Overflow用户
提问于 2014-11-10 22:22:43
回答 5查看 978关注 0票数 0

棋盘上有64个正方形。每个广场都有以前的两倍。编写一个程序,显示:-每个正方形上有多少粒,和-谷物的总数。

我的代码在第一部分工作,但我在声明总数时遇到了问题。一些我缺少的基本类/方法声明。谢谢你的帮助。

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-10 23:01:57

这是一个元答案,结合了这里所有的好主意(到处都是!)使用您的类创建完整的解决方案。

代码语言:javascript
复制
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

用法:

代码语言:javascript
复制
board = Grains.new
board.square(3) #=> 4
board.total #=> 18446744073709551615
票数 2
EN

Stack Overflow用户

发布于 2014-11-10 22:25:19

这里有很多问题。

首先,array_of_grainssquare的本地特性。它不存在于方法之外。如果您希望它是Grain实例上的实例变量,那么它需要是@array_of_grains

其次,您的total方法会导致一个错误,因为它没有本地的array_of_grains变量来调用each。即使存在,sum也将是未定义的。您需要声明sum并将其初始值设置为0,或者只需使用inject(&:+),这是oldest Ruby tricks in the book中的一种。

第三,每次调用方法array_of_grains时都要重新构建整个square数组。您可以使用||=只计算该值一次。

您的方法应该如下所示:

代码语言:javascript
复制
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的问题。

票数 3
EN

Stack Overflow用户

发布于 2014-11-10 22:48:12

这是写它的一种方式:

代码语言:javascript
复制
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]

以确定总数(我最初在问题中漏掉的):

代码语言:javascript
复制
total, square = 63.times.reduce([0,[1]]) do |(t,a),_|
  v = 2 * a.last
  [t + v, a << v]
end

total  #=> 18446744073709551614
square #=> (as above)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26854106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档