有人为我打破了这个障碍,请

时间:2017-07-23 22:01:03

标签: ruby

好的,这是我的理解。

  1. prices.combination(2) - 制作一个子阵列[10,11] [2,9] ......

  2. .map - 创建一个数组

  3. do |buy,sell| [buy, sell, sell-buy] - 这是我感到困惑的第一部分。 |买,卖|对我来说看起来很正常,但我从未见过以下阵列。我写的所有块都与价格do | i |相似我* 2结束。迭代器后的数组是如何工作的?

  4. 4 .end.max_by - 找到之前卖出的最大金额??

    1. do |buy, sell, profit| profit - 利润是如何产生的?我们是如何从买卖到盈利的呢?

    2. 我明白一切都在做什么我只是不理解这个结构。寻找一个很好的解释。

      a = [10, 11, 2, 9, 4, 3, 5, 6]
      
      def max_profit(prices)
        prices.combination(2).map do |buy, sell|
          [buy, sell, sell - buy]
        end.max_by do |buy, sell, profit|
          profit
        end
      end
      
      max_profit(a)
      

1 个答案:

答案 0 :(得分:3)

  

迭代器之后的数组是如何工作的?

与块中的任何表达式相同的方式。 Ruby将评估表达式,如果它是块中的最后一个表达式,Ruby将使用结果作为块的值。在这种情况下,表达式创建一个包含三个元素的新数组。没有什么特别的事情发生。

因此,当您编写.map { |buy, sell| [buy, sell, sell - buy] }时,这是一堆Ruby代码,应用于具有买入价和卖出价的数组,并返回一个新数组,其中每个项目都有买入价,卖出价和利润。如果您不知道,使用金钱的人通常将他们的利润定义为他们赚取的钱(例如,用于出售物品)减去他们花费的钱(例如购买物品)。所以这个区块计算买卖价格的利润。如果您在Excel中工作,那些Ruby代码就相当于添加一个新列并使用公式将每个单元格设置为等于前两列中值的差异。

继续前进,您对.max_by { |buy, sell, profit| profit }感到困惑。它只选择具有最大利润的数组中的元素。该块作为参数传递给max_by,以便max_by知道您想要最大化的内容。如果您仍然感到困惑,请查看Enumerable#max_by的文档。

顺便说一句,了解Ruby代码的一个好方法是打印出中间结果。尝试运行此代码,以便在计算利润之后但在运行max_by之前查看数组的外观:

def max_profit(prices)
  tmp = prices.combination(2).map do |buy, sell|
    [buy, sell, sell - buy]
  end

  p tmp  # print out tmp nicely

  tmp.max_by do |buy, sell, profit|
    profit
  end
end