3

我使用以下代码在 ruby​​ 中实现了贪婪算法:

class Greedy
  def initialize(unit, total, *coins)
    @total_coins1 = 0
    @total_coins2 = 0
    @unit = unit
    @total = total
    @reset_total = total
    @currency = coins.map 
    @currency.sort!
    @currency = @currency.reverse
    unless @currency.include?(1)
      @currency.push(1)
    end
  end
  def sorter
    @currency.each do |x|
      @pos = @total / x
      @pos = @pos.floor
      @total_coins1 += @pos
      @total -= x * @pos
      puts "#{@pos}: #{x} #{@unit}"
    end
    puts "#{@total_coins1} total coins"
  end
end

当我尝试运行代码时:

x = Greedy.new("cents", 130, 50, 25, 10, 5)

我收到一个错误:

NoMethodError: undefined method `sort!' for #<Enumerator: [50, 25, 10, 5]:map>
    from /Users/Solomon/Desktop/Ruby/greedy.rb:9:in `initialize'
    from (irb):2:in `new'
    from (irb):2
    from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'

作为 Ruby 的新手,我不知道这意味着什么,也不知道如何修复它,因为这[50, 25, 10, 5].sort!是一个完全有效的方法......我该如何修复这个错误?

4

2 回答 2

8

你的问题在这里:@currency = coins.map

如果您在map没有块的情况下调用,它将返回一个Enumerator. 你想在这里映射什么?如果您不想对 的值做任何事情coins,只需分配@currency = coins.sort.reverse并保存自己的sort!reverse步骤。

于 2012-05-02T13:41:09.430 回答
1

枚举器没有排序方法。它属于 Enumerable。没有块的 Map 方法返回一个枚举器。

在您的示例中,您已经使用 * splatten 运算符,因此硬币已经是一个数组。但是如果你坚持强制转换它,你可以使用

@currency  = coins.to_a
@currency = @currency.sort!

或者只是缩短为:

@currency = coins.to_a.sort

to_a 方法会将其转换为数组,相当于:

coins = coins.map{|x| x}
于 2012-05-02T14:05:31.160 回答