Max и Min Value ... Нужен метод для возврата двух значений переменных - PullRequest
3 голосов
/ 30 октября 2010

Я новичок в кодировании и мне нужна помощь, чтобы понять, что не так с моей логикой и / или синтаксисом в следующем методе ... Программа должна возвращать максимальное и минимальное значения массива. Моя цель состояла в том, чтобы две переменные (max и min) были вне метода, чтобы при выполнении метода через массив значения заменялись соответствующим образом. спасибо за помощь ...

    list=[4,6,10,7,1,2]

max=list[0]
min=list[0]

def maxmin(list)

  f=list.shift
  if list.empty?then
      return max = f 
      return min = f
  end

  t=maxmin(list)
  if(f>t) then
    return max = f 
    return min = t
  else
    return max = t 
    return min = f
  end

end

printf("max=#{max}, min=#{min}, method return=%d\n", maxmin(list)) 

Ответы [ 5 ]

4 голосов
/ 30 октября 2010

Используя 1.9.1, есть minmax

>> list=[4,6,10,7,1,2]
=> [4, 6, 10, 7, 1, 2]
>> list.minmax
=> [1, 10]
3 голосов
/ 30 октября 2010

Редактировать: ваш вопрос только о возврате двух переменных? Если это так, просто разделите их запятой, и они будут возвращены в виде массива:

return min_value, max_value

Чтобы добавить к тому, что уже написано (да, используйте встроенные библиотеки), обычно плохая идея изменять переменные вне метода, в котором они используются. Обратите внимание, что в вызове фреймворка новые значения возвращается Это позволяет человеку, вызывающему метод, решать, что делать с этими значениями, а не этот метод, предполагая, что переменные существуют, а затем изменяя их все время.

Если бы мне пришлось написать это (и я новичок в Ruby, так что, возможно, я не буду делать это настолько элегантно, насколько это возможно, но за ним должно быть легко следить), я написал бы что-то вроде этого:

def find_min_max(list)
  if (list.nil? || list.count == 0)
    return nil, nil
  end

  min = list.first
  max = list.first

  list.each do |item|
    if item.nil?
      next
    elsif item < min
      min = item
    elsif item > max
      max = item
    end
  end

  return min, max
end

list = [1, 439, 2903, 23]
min_max = find_min_max list

p min_max
3 голосов
/ 30 октября 2010

Макс и Мин метод уже в Stdlib или ruby ​​

Так что пользуйтесь

list.max
list.min
0 голосов
/ 10 мая 2016

Проблема в том, что вы пытаетесь использовать глобальные переменные (которые называются так: @max, @min), но вы хотите, чтобы ваш код назначал значения, которые вы даже не назначаете.Вы бы предпочли выбирать локальные переменные вместо глобальных, если это возможно, из-за доступности.

Вторая проблема заключается в том, что в случае использования глобальной переменной вам не нужно ничего возвращать.например:

@value = 0

def test
  @value = 1
end

puts @value ==> 0
test # change @value to 1
# it also return 1 because ruby return last statement value
puts @value ==> 1

В случае, если вы используете локальные переменные, вы должны вернуть несколько результатов.Вот где Ruby выполняет свою работу, Ruby автоматически приводит несколько операторов return к массиву и присваивает массиву несколько переменных)

list = [4,6,10,7,1,2]

def maxmin(list)

  f = list.shift
  if list.empty? then
      return f, f # f is the minimum and the maximum of a list of one element
  end

  mi, ma = maxmin(list)
  if (f > ma) then
    ma = f
  elsif (f < mi)
    min = f
  end

return mi, ma
end

min, max = maxmin(list)
printf("max=#{max}, min=#{min}") 

Ваш способ работы довольно забавный (люблю рекурсивность), но он не очень элегантен, производительностьне очень хороши и, более того, это немного сбивает с толку, это далеко от понимания ruby.

list = [4,6,10,7,1,2]

def minmax(list)
  max = list[0]
  min = list[0]

  list.each do |elem|
    if elem > max then
      max = elem
    elsif elem < min
      min = elem
    end
  end

  return min, max
end

min, max = minmax(list)
printf("max=#{max}, min=#{min}") 

Является более четкой версией вашего кода, даже если она менее крутая.Вы можете попробовать эти ответы с глобальными переменными, это должно быть легко.

Очевидно, из-за видения Ruby, когда вы закончите с этим, вы можете использовать Array.max и Array.min.

0 голосов
/ 30 октября 2010

Я бы согласился с другими ответами.Нет смысла писать этот метод, кроме как в программировании.

Есть несколько проблем с логикой, которые могут объяснить, почему вы не получаете ожидаемый результат.

Во-первых, есть 3 пары операторов возврата, вторая из которых никогда не будет вызвана, потому что метод уже возвращен, например:

return max = f
return min = f # never gets called

Вам необходимо вернуть значения min и max.чтобы рекурсивный алгоритм работал так, я думаю, вам нужно вернуть пару значений или массив в одном операторе возврата.

Во-вторых, ваши минимальные и максимальные переменные, инициализированные в строках 3 и 4, не находятся в области видимости в пределахтело метода minmax, так что вы на самом деле определяете там новые локальные переменные.

Если вы адаптируете свой код, вы можете получить что-то вроде этого, но это не тот метод, который вам нужно писать в рабочей среде, и яуверен, что есть лучшие способы сделать это:

list = [4,6,10,7,1,2]

def maxmin(list)
  f = list.shift
  if list.empty?
    return f, f
  end

  max, min = maxmin(list)
  return f > max ? f : max, f < min ? f : min
end

max, min = maxmin(list)
puts "min = #{min}, max = #{max}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...