【问题标题】:Exponentiation not working求幂不起作用
【发布时间】:2016-02-13 10:55:06
【问题描述】:

我是编程新手,尤其是 Ruby,所以我一直在做一些基本的项目。我有这段代码,据我所知,它应该可以工作,但它给出了我没想到的结果

程序接受 a 和 B 并返回 a^b。我这样做是为了进行编程练习,因此我不只是去 a**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

但他们绝对不是那样

【问题讨论】:

  • 为什么不直接@args[:a] ** (@args[:b] + 1)
  • @spickermann 因为我想手动完成,作为编程练习
  • 你应该通过描述你想让程序做什么来改进你的问题,否则它将被关闭。

标签: ruby multiplication exponentiation


【解决方案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

【讨论】:

  • 谢谢!在此之后我唯一改变的是将 @ans = 1 移出初始化并进入索引,否则它不会重置。
【解决方案2】:

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

对局部变量使用实例变量似乎不对——它们的生命周期更长,因此在方法退出后,如果整个对象仍被某处引用,则无法收集它们。此外,@s 更容易出错 - 如果你打错字(例如 - @asn 而不是 @ans),你会得到 nil 而不是 NameError,它可能更难调试,所以最好这样写:

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

对于在 ruby​​ 中带有累加器的循环,最好使用Enumerable#inject

@ans = @args[:b].times.inject(1){|acc,v| acc * @args[:a]}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2018-10-20
    • 2011-04-26
    • 2012-09-10
    • 2018-05-09
    相关资源
    最近更新 更多