Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 更改代码顺序会导致错误吗? def库存_选择器价格 最小日,最大日,利润=0,0,0 i=1 而我的长度 (0…i).每天| 如果价格[i]-价格[day]>利润 最小日,最大日,利润=日,i,价格[i]-价格[日] 结束 #i+=1 结束 i+=1 结束 返回“[#{minu_day},#{max_day}” 结束 价格=[17,3,6,9,15,8,6,1,10] 把股票和股票的价格挂钩_Ruby - Fatal编程技术网

Ruby 更改代码顺序会导致错误吗? def库存_选择器价格 最小日,最大日,利润=0,0,0 i=1 而我的长度 (0…i).每天| 如果价格[i]-价格[day]>利润 最小日,最大日,利润=日,i,价格[i]-价格[日] 结束 #i+=1 结束 i+=1 结束 返回“[#{minu_day},#{max_day}” 结束 价格=[17,3,6,9,15,8,6,1,10] 把股票和股票的价格挂钩

Ruby 更改代码顺序会导致错误吗? def库存_选择器价格 最小日,最大日,利润=0,0,0 i=1 而我的长度 (0…i).每天| 如果价格[i]-价格[day]>利润 最小日,最大日,利润=日,i,价格[i]-价格[日] 结束 #i+=1 结束 i+=1 结束 返回“[#{minu_day},#{max_day}” 结束 价格=[17,3,6,9,15,8,6,1,10] 把股票和股票的价格挂钩,ruby,Ruby,我的目标是实现一种“股票选择器”方法,它接收一系列股票价格,每假设一天一个。它应该返回一对代表最佳买入日和最佳卖出日的天数。天从0开始 我的问题是,如果我删除第11行并将其写在第9行,为什么这段代码不起作用。这将导致如下错误: def stock_picker prices min_day , max_day , profit = 0 , 0 , 0 i = 1 while i < prices.length

我的目标是实现一种“股票选择器”方法,它接收一系列股票价格,每假设一天一个。它应该返回一对代表最佳买入日和最佳卖出日的天数。天从0开始

我的问题是,如果我删除第11行并将其写在第9行,为什么这段代码不起作用。这将导致如下错误:

     def stock_picker prices
        min_day , max_day , profit = 0 , 0 , 0
        i = 1
        while i < prices.length    
            (0...i).each do |day|
              if prices[i] - prices[day] > profit
                  min_day , max_day , profit = day , i , prices[i] - prices[day]
              end
                #i += 1
            end
            i += 1
        end

            return "[#{min_day}, #{max_day}]"
      end

        prices = [17,3,6,9,15,8,6,1,10]

        puts stock_picker prices
**PS C:\Users\dlim\mystuff>ruby stockpicker.rb
rb:8:in`block in stock_picker':nil:NilClass(NoMethodError)的未定义方法“-”
来自stockpicker.rb:7:in'each'
来自stockpicker.rb:7:in'stock_picker'
来自stockpicker.rb:29:in`'

这是在哪里发生的?

你的错误

当它试图在
i=9
时访问
prices[i]
并且
prices
返回
nil
时, 它不响应减号
-
运算符

为什么会发生这种情况?

你是一个循环中的一个循环

if prices[i] - prices[day] > profit
在这里增加
i
索引计数器变量实际上没有意义,因为
已经在范围
(0…i)
和 在这个循环中增加
i
意味着它比较
价格中的每个值
数组一次针对下一个
价格
内部数组中的值,其中 将仅包括
价格的前三个值
(表示
prices
数组的末尾,如
1
10
将永远不会与 彼此);e、 g

在第8次迭代中,当 使用
prices[i]
访问prices数组,但仍在 第二个循环的范围为
(0…7)
,在第五次迭代后设置,因此 它没有到达while循环的转义子句/表达式
而i

可能的解决方案:

您可以保留您的工作解决方案,也可以使用 另一个范围作为外环

i = 1
prices = [17,3,6,9,15,8,6,1,10]

# iteration 0
if prices[i] - prices[day] > profit
#          3 - 17 > 0 # => false


# iteration 1
i += 1 # => 2
day # => 0

if prices[i] - prices[day] > profit
#          6 - 17 > 0 # => false

i += 1 # => 3
day # => 1


# iteration 2
if prices[i] - prices[day] > profit
#          9 - 3 > 0 # => true
min_day, max_day, profit = 1, 3, 6

i += 1 # => 4
day # => 0


# iteration 3
if prices[i] - prices[day] > profit
#          15 - 17 > 0 # => false

i += 1 # => 5
day # => 1


# iteration 4
if prices[i] - prices[day] > profit
#          8 - 3 > 0 # => true

min_day, max_day, profit = 1, 5, 5
i += 1 # => 6
day # => 2


# iteration 5
if prices[i] - prices[day] > profit
#          6 - 6 > 0 # => false

i += 1 # => 7
day # => 3


# iteration 6
if prices[i] - prices[day] > profit
#          1 - 9 > 0 # => false

i += 1 # => 8
day # => 0


# iteration 7
if prices[i] - prices[day] > profit
#         10 - 17 > 0 # => false

i += 1 # => 9
day # => 1


# iteration 8
if prices[i] - prices[day] > profit
#        nil - 3 > 0 # => NoMethodError
而不是在while循环中增加索引计数器变量

(1...prices.length).each do |i|
  # ...
end
根据您的要求,它将在以下几天内迭代

def stock_picker prices
  min_day , max_day , profit = 0 , 0 , 0
  (1...prices.length).each do |i|
    (0...i).each do |day|
      if prices[i] - prices[day] > profit
        min_day , max_day , profit = day , i , prices[i] - prices[day]
      end
    end
  end

  return "[#{min_day}, #{max_day}]"
end

prices = [17,3,6,9,15,8,6,1,10]

puts stock_picker prices
更新:

您还可以使用

生成与在所暗示的范围内迭代相同的唯一且不重复的天数对,如下所示

i = 1
while i < prices.length
  # ...
  i +=1
end
(0...prices.length).to_a.combination(2)

| day,i |
将访问组合数组中的day索引对数组中的第一个和第二个变量,同时重用您使用的现有变量名。

您基本上是在尝试重写,并且:

如果您想要天数和相应的价格:

prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]
days = (0...prices.size).to_a
p days.combination(2).max_by { |day1, day2| prices[day2] - prices[day1] }
# => [1,4]

您好,在迭代示例中,您是如何计算天数的?天不是应该在每次按照范围(0…1)迭代时只+1吗。据我所知,在迭代0时,天应该是0,在迭代1时,天应该是1,迭代2时,天应该是2,以此类推。我想我误解了其中的一些部分。重新运行您的原始代码,在它达到
nil
之前,我会得到以下几对
[I,day]
[1,0],[2,0],[3,1],[4,0],[5,1],[6,2],[7,3],[8,0],[9,1]
。对于迭代0和迭代1,它是
0
两次的原因是所使用的包含与排除范围;e、 g.
(0..1)。to#a=>[0,1]
vs
(0…1)。to#a=>[0]
。因此,范围
(0…1)
将运行一次,即迭代0,范围
(0…2)
将运行两次,即迭代1和2使用
构建的范围。
从头到尾运行。使用
创建的值不包括结束值。
def stock_picker prices
  min_day , max_day , profit = 0 , 0 , 0
  (1...prices.length).each do |i|
    (0...i).each do |day|
      if prices[i] - prices[day] > profit
        min_day , max_day , profit = day , i , prices[i] - prices[day]
      end
    end
  end

  return "[#{min_day}, #{max_day}]"
end

prices = [17,3,6,9,15,8,6,1,10]

puts stock_picker prices
[i, day]
# => [1, 0], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0], [8, 0],
#    [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 1], [8, 1],
#    [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2],
#    [4, 3], [5, 3], [6, 3], [7, 3], [8, 3],
#    [5, 4], [6, 4], [7, 4], [8, 4],
#    [6, 5], [7, 5], [8, 5],
#    [7, 6], [8, 6],
#    [8, 7]
(0...prices.length).to_a.combination(2)
def stock_picker prices
  min_day , max_day , profit = 0 , 0 , 0
  (0...prices.length).to_a.combination(2).each do |day, i|
    if prices[i] - prices[day] > profit
      min_day , max_day , profit = day , i , prices[i] - prices[day]
    end
  end

  return "[#{min_day}, #{max_day}]"
end

prices = [17,3,6,9,15,8,6,1,10]

puts stock_picker prices
prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]
days = (0...prices.size).to_a
p days.combination(2).max_by { |day1, day2| prices[day2] - prices[day1] }
# => [1,4]
[17,3,6,9,15,8,6,1,10].each.with_index.to_a.
                       combination(2).max_by{|(buy, day1), (sell, day2)|
                         sell-buy
                       }
# => [[3, 1], [15, 4]]