LocalJumpError (Ruby on Rails) - PullRequest
       8

LocalJumpError (Ruby on Rails)

1 голос
/ 24 июня 2009

Я искал / гуглил, но борюсь со следующей проблемой.

Я создаю приложение Rails 2.3.2, и одним из требований является вычисление медианы массива результатов. Я использую код для вычисления медианы из Ruby Cookbook, но продолжаю сталкиваться с проблемой получения ошибки «LocalJumpError - блок не указан», когда я пытаюсь найти медиану массива с нечетным числом членов. 1003 *

Пример кода на мой взгляд выглядит следующим образом:

<%= survey_response.median([6,4,5,4,4,2]) %>

Тогда в модели survey_response.rb используются следующие методы:

def mean(array)
  array.inject(array.inject(0) { |sum, x| sum += x } / array.size.to_f)
end

def median(array,already_sorted=false)
  return nil if array.empty?
  array = array.sort unless already_sorted
  m_pos = array.size / 2
  return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])      
end

Ошибка возникает, когда медианный метод обращается к среднему методу, чтобы получить носитель с нечетным количеством элементов в массиве. Я просто не могу понять, почему я получаю эту ошибку или, на самом деле, как ее исправить - так что я был бы очень признателен за любую помощь / руководство / смех, который кто-либо мог предложить мне!

Спасибо

Simon

Ответы [ 3 ]

1 голос
/ 24 июня 2009

Лучший код:

def mean(array)
  array.inject { |sum, n| sum + n } / array.length.to_f
end

def median(array)
  return nil if array.empty?
  array.sort!
  middle = array.length / 2
  (array.length % 2 == 1) ? array[middle] : mean([array[middle-1], array[middle]])
end

puts median([5,11,12,4,8,21]) # => 9.5
1 голос
/ 24 июня 2009

Этот mean метод выглядит ужасно испорченным. Попробуйте это:

def mean(array)
  a.inject(0) { |sum,x| sum += x } / a.size.to_f
end
1 голос
/ 24 июня 2009

Лис выглядит так, как будто вы используете дробный индекс в массиве. Попробуйте заменить:

m_pos = array.size / 2

с:

m_pos = (array.size / 2) .ceil

Также попробуйте изменить среднюю функцию на это:

def mean(array)
  array.inject(0) { |sum, x| sum += x } / array.size.to_f
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...