如何在不使用" max"的情况下在Ruby中找到max功能

时间:2016-03-17 17:44:33

标签: arrays ruby function max

我需要在不使用max方法的情况下找到数组的最大值。现在我有:

def max(arr)
  largest_num = arr(1)
  arr.each do |num|
    if element >= largest_num
      largest_num = num
    else
      largest_num = largest_num
    end
    puts largest_num
  end

  my_numbers = [20, 30, 40, 50]
  puts max(my_numbers)
end

4 个答案:

答案 0 :(得分:2)

为什么不使用sortlast

array = [3,7,2,4,6,1,8,5]
array.sort.last
#=> 8

答案 1 :(得分:1)

如果您需要使用 DECLARE @cols AS NVARCHAR(MAX) , @query AS NVARCHAR(MAX); SELECT @cols = STUFF( (SELECT DISTINCT ','+QUOTENAME(CAST(ROW_NUMBER() OVER(PARTITION BY q.SectorID , y.Name ORDER BY a.QuestionID) AS VARCHAR(10))) FROM Answers a LEFT JOIN Years y ON a.YearID = y.YearID LEFT JOIN Organisations o ON a.OrganisationID = o.OrganisationID LEFT JOIN Questions q ON a.QuestionID = q.QuestionID FOR XML PATH(''), TYPE).value ('.', 'NVARCHAR(MAX)'), 1, 1, ''); SET @query = ' SELECT Organisation, Year, '+@cols+' from ( SELECT QuestionID = ROW_NUMBER() OVER(PARTITION BY q.SectorID , y.Name ORDER BY a.QuestionID) , o.Name AS Organisation , y.Name AS Year , a.Answer FROM Answers a LEFT JOIN Years y ON a.YearID = y.YearID LEFT JOIN Organisations o ON a.OrganisationID = o.OrganisationID LEFT JOIN Questions q ON a.QuestionID = q.QuestionID ) src pivot ( max(Answer) for QuestionID in ('+@cols+') ) piv order by Organisation, Year '; PRINT(@query); EXECUTE (@query); sort,则以下答案将不适合您。

last效率低下,因为当你需要的是最大的时候,它需要对整个数组进行排序。尝试类似:

arr.sort.last

arr.reduce{|largest, num| if num > largest then num else largest end} 函数(也称为reduce)用于将数组“缩减”为单个对象。要实现总和,您可以执行以下操作:

inject

num_arr = [1,2,3,4,5] num_arr.reduce(0){|sum, num| sum + num} #=> 15 是总和的起始值,然后对于每个元素,块运行到目前为止的总和以及数组中的元素。然后返回块的结果(0,因为在ruby中隐式返回最后一个语句)被设置为下一个元素的新值sum + numsum的最终值是返回的内容。

这类似于:

sum

如果未指定起始值,则将第一个元素作为起始值。因此,在我的sum = 0 sum = sum + num_arr[0] sum = sum + num_arr[1] sum = sum + num_arr[2] sum = sum + num_arr[3] sum = sum + num_arr[4] 解决方案中,第一个元素被设置为“最大”,然后对于每个元素依次传递最大值,或者如果元素大于当前最大元素,则它成为新元素最大。

答案 2 :(得分:1)

  

我被告知我应该使用.sort和.last但不太确定在哪里开始

在编程时成为自我启动者非常重要。这是一个必不可少的特征,因为该领域和所有技术都在迅速发展。我建议阅读" How much research effort is expected of Stack Overflow users?"另外,特别是如果你想使用Stack Overflow作为资源。

以下是如何学习使用Ruby进行实验并自学:

Ruby捆绑了IRB。在命令行键入irb,它应该打开并向您显示提示。在该提示符下,您可以输入Ruby表达式并查看结果。我的提示可能与你的提示不一样,因为我的提示是自定义的,但你可以弄清楚如何使用它:

$ irb
irb(main):001:0>

将数组分配给变量:

irb(main):001:0> my_numbers = [20, 30, 40, 50]
=> [20, 30, 40, 50]

我可以通过输入变量名称并按返回输入来查看分配给my_numbers的值:

irb(main):002:0> my_numbers
=> [20, 30, 40, 50]

我可以尝试使用my_numbers上的方法:

irb(main):003:0> my_numbers.shuffle
=> [50, 30, 40, 20]

接受了数组并将其随机化。它没有改变my_numbers,它只是改组数组并以洗牌顺序输出一个新数组:

irb(main):004:0> my_numbers
=> [20, 30, 40, 50]

每次运行shuffle时,它会随机化数组并返回另一个数组:

irb(main):005:0> my_numbers.shuffle
=> [50, 20, 30, 40]
irb(main):006:0> my_numbers.shuffle
=> [40, 20, 30, 50]

由于您希望使用sortlast来查找最大值,因此从无序数组开始会很好。测试sort

irb(main):009:0> my_numbers.shuffle.sort
=> [20, 30, 40, 50]

在洗牌后对数组进行排序。

这是last的作用:

irb(main):010:0> my_numbers.last
=> 50

现在你已经足够了解自己。

答案 3 :(得分:0)

如果您真的被告知应该使用sortlast,那么答案很简单:

2.1.1 :003 > [2,3,1,4,8,6].sort.last
=> 8

如果你想要方法:

def max(arr); arr.sort.last; end

2.1.1 :004 > def max(arr); arr.sort.last; end
=> :max 
2.1.1 :005 > max([2,1,3])
=> 3