1

我正在编写一个 ruby​​ 脚本,它将获取数字并输出中位数。这是我的代码

numbers = Array.new    
numbers = [gets]     
def median(numbers)     
    sorted = numbers.sort
    mid = numbers.length/2 sorted[mid] 
    numbers.push mid    
end 
end

当你运行它时,它会询问数字但不会给出中位数......

4

5 回答 5

3
def median(array)
  array.sort!
  if array.length % 2 == 0
    median_value = (array[array.length / 2] + array[array.length/2 - 1]) / 2.0
  else
    median_value = array[array.length / 2]
  end
end
于 2013-02-17T01:53:49.587 回答
2

你从不调用中值方法,你只定义它。

于 2011-04-26T00:29:06.863 回答
1

以下是我在 Enumerable 上使用的一些猴子补丁,包括一个用于中位数的补丁:

module Enumerable
  # Does not sort the values; do this yourself before calling if you like
  def median( &blk )
    values = blk ? map( &blk ) : self
    values[ values.length / 2 ]
  end
  def sum( &blk )
    values = blk ? map( &blk ) : self
    values.inject(0){ |sum,v| sum + v }
  end
  def average( &blk )
    (length==0) ? 0 : (sum( &blk ) * 1.0 / length)
  end
  alias_method :avg, :average
  def std_dev( &blk )
    values = blk ? map( &blk ) : self
    mean = values.average
    Math.sqrt( values.map{ |value| (value-mean)*(value-mean) }.average )
  end
  def dups_by
    keyvals = Hash.new{|h,v|h[v]=[]}
    each{ |v|   keyvals[yield(v)] << v }
    result = []
    keyvals.each{ |k,v| result << v if v.length > 1 }
    result
  end  
end
于 2011-04-26T01:56:58.647 回答
1

这里有几个问题:

  1. 您有一个额外的end关键字,不需要您在此处发布的内容。
  2. gets返回一个字符串。例如,您可以收集以空格分隔的数字并从中创建一个数组。
  3. 你没有打电话median,这就是为什么它不会给你中位数。

所以这样的事情会起作用:

def median(numbers)     
    sorted = numbers.sort
    numbers[numbers.length/2]  
end 

p median(gets.split(' '))
于 2011-04-26T02:00:17.723 回答
1

这是家庭作业吗?

首先确保你的输入是你认为的。我将您的代码放在一个名为 median.rb 的文件中,然后运行 ​​rdebug。注意[gets]之后的 numbers 数组的内容

$ rdebug median.rb
median.rb:1
numbers = Array.new
(rdb:1) n
median.rb:2
numbers = [gets] 
(rdb:1) n
1 2 3 4 5 6 7
median.rb:5
def median(numbers) 
(rdb:1) p numbers
["1 2 3 4 5 6 7\n"]
(rdb:1) p numbers[0]
"1 2 3 4 5 6 7\n"
(rdb:1) p numbers[0].class
String
(rdb:1)
于 2011-04-26T00:28:10.857 回答