指数不起作用

时间:2016-02-13 10:55:07

标签: ruby multiplication exponentiation

我是编程新手,特别是在Ruby中,所以我一直在做一些基本的项目。我有这个代码,据我所知,它应该工作,但它给出了我不希望的结果

程序取a和B并返回^ b。我这样做是为了编程练习,因此为什么我不只是去做一个**。

class Exponate
  attr_accessor :args

  def initialize args = {}
    @args = args
    @ans = nil
  end

  def index
    @args[:b].times {
      @ans = @args[:a] * @args[:a]
    }
    puts @ans
  end
end

e = Exponate.new(:a => 32, :b => 6)
e.index

e.args[:a] = 5
e.index

返回

1024     # Should be 1_073_741_824
25       # Should be 15_625

但他们肯定不是那个

2 个答案:

答案 0 :(得分:1)

您可以这样写:

class Exponate
  attr_accessor :args, :ans

  def initialize args = {}
    @args = args
  end

  def index
    @ans = 1 # multiplication will start from 1
    @args[:b].times {
      @ans *=  @args[:a] #same as @ans = @ans * @args[:a]
    }
    puts @ans
  end
end

答案 1 :(得分:1)

@ans = @args[:a] * @args[:a]将返回相同的值,无论调用多少次,您都需要以某种方式引用累加器变量以利用循环。

对本地使用实例变量似乎不对 - 它们的生命周期更长,因此在方法退出后,如果仍然在某处引用整个对象,则无法收集它们。此外@更容易出错 - 如果您输入错字(例如 - @asn而不是@ans),您将获得nil而不是{{} 1}},它可能更难调试,所以最好这样写:

NameError

对于在ruby中使用累加器的循环,最好使用def index ans = 1 args[:b].times { ans *= args[:a] } puts ans end

Enumerable#inject

这样就不太可能忘记初始化。