Функция с массивами в качестве параметра - PullRequest
0 голосов
/ 15 декабря 2018

Как я могу написать функцию Ruby, которая может вычислять среднее значение массива?Если массив не имеет каких-либо элементов, результат должен быть 0. Я должен использовать цикл для реализации.Я начал так, но я не совсем уверен, как использовать цикл.

a = [1, 2, 3, 4, 5, 6]

def average(a)  
  sum = 0.0
  result = 0.0
  if array.length > 0 then
    array.each do |item|
      sum += item
    end
    result = sum / array.length
  end
  return result.to_f
end

Ответы [ 4 ]

0 голосов
/ 16 декабря 2018
def average(a)
  if a.empty?
    0
  else
    sum = a.inject(0.0){|x, sum| sum += x}
    sum / a.size.to_f
  end
end
0 голосов
/ 16 декабря 2018

Вы можете написать это:

def average(values)
    total = 0.0

    values.each do |i| 
        total += i
    end

    return total / values.length()
end

Если вы хотите использовать цикл, вы можете сделать это следующим образом:

def average(values=[])
    total = 0.0

    for i in values
        total += i
    end

    return total / values.length()
end

Если передан непустой массив,он вернет среднее значение.Если передан пустой массив, он вернет 0.0.

. Вы можете проверить это следующим образом:

puts average([1, 2, 3, 4, 5]) #=> "3"
puts average([]) #=> "0"
0 голосов
/ 16 декабря 2018
def average(arr, precision=0)
  return 0 if arr.empty?
  arr.sum.fdiv(arr.size).round(precision)
end

arr = [1,2,3,7]

average(arr)   #=> 3
average(arr,2) #=> 3.25

Вместо использования Integer # fdiv вы можете написать

(arr.sum.to_f/arr.size).round(precision)
0 голосов
/ 15 декабря 2018

Полагаю, мы также можем написать это просто, как показано ниже

a = [1, 2, 3, 4, 5, 6]
def average(arr=[])  
  sum = 0.0
  i=0
  while(i < arr.length) do
    sum += arr[i].to_f
    i += 1
  end
  return ((i==0) ? 0 : (sum / i))
end

Мы можем выполнить цикл и вычислить сумму таким образом.Затем для среднего мы взяли значение i, которое будет сохранено после цикла, и сделаем условный оператор для возврата результата.

Это простое решение, я не проверял его, хотя может иметь ошибки.Вы можете попробовать на своей стороне.Надеюсь, что это помогает !!

...