如何在不使用“max”函数的情况下在Ruby中查找max

sg24os4d  于 2022-12-03  发布在  Ruby
关注(0)|答案(5)|浏览(162)

我需要在不使用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
qxsslcnc

qxsslcnc1#

为什么不直接使用sortlast呢?

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

yb3bgrhw2#

我被告知我应该使用.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]

我可以通过输入变量名并按Return或Enter键来查看分配给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来求最大值,所以最好从一个无序数组开始。

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

数组会在混洗之后排序。
last的作用如下:

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

现在你知道的够多了,可以自己去弄清楚了。

np8igboo

np8igboo3#

如果您需要使用sortlast,则下面的答案不适用。
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是求和的起始值,然后对于每个元素,使用到目前为止的求和和数组中的元素运行该块。然后将块的结果(返回sum + num,因为ruby中的最后一个语句是隐式返回的)设置为下一个元素的新值sumsum的最终值是返回的值。
这类似于执行以下操作:

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]

如果不指定起始值,则第一个元素将被作为起始值。因此,在我的reduce解决方案中,第一个元素被设置为“最大”,然后依次传递每个元素的最大值,或者如果该元素大于当前最大值,则它将成为新的最大值。

50few1ms

50few1ms4#

如果您真的被告知应该使用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
uwopmtnx

uwopmtnx5#

如果您尝试在不使用默认函数的情况下解决此问题,请首先不使用排序方法对数组进行排序

asc = [45,34,12,4,5,32,54,76]
asc.each do |a|
    i = 0
    asc.each do |b|
        if b > asc[i +1]
            asc[i], asc[i + 1] = asc[i + 1], asc[i]
        end
        i += 1 if i < asc.size - 2
    end
end
p asc.last

这将给予排序数组中的最大数字

相关问题