【问题标题】:Someone break this block down for me please请有人为我打破这个障碍
【发布时间】:2017-12-29 10:20:05
【问题描述】:

好的,这是我的理解。

  1. prices.combination(2)-创建一个子数组 [10,11][2,9]...

  2. .map - 创建一个数组

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

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)
    

【问题讨论】:

  • 嗨,Jacob,请重新格式化您的问题。创建一个代码块(缩进四个空格),然后在每一行添加 cmets(ruby 中的 # 符号)来扩展您的想法。不管你怎么做,你需要使代码 100% 可读,否则你的问题将开始收到反对票。
  • 有人刚刚为我编辑了它,而我正在尝试做同样的事情。对此感到抱歉。

标签: ruby


【解决方案1】:

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

块中任何表达式的工作方式相同。 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

【讨论】:

  • 所以通过将 max_by 链接到 [buy,sell,profit] 您将 max_by 的值分配给利润。对吗?
  • 不,max_by 是您正在调用的函数,而不是值。您不应该考虑更改功能;定义函数,然后调用它们。你看文档了吗?这是:ruby-doc.org/core-2.4.1/Enumerable.html#method-i-max_by
  • 啊,再次阅读文档后,现在很清楚了。这是一个巨大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2012-05-20
  • 2021-10-07
  • 2016-11-09
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多