我正在编写一个 ruby 脚本,它将获取数字并输出中位数。这是我的代码
numbers = Array.new
numbers = [gets]
def median(numbers)
sorted = numbers.sort
mid = numbers.length/2 sorted[mid]
numbers.push mid
end
end
当你运行它时,它会询问数字但不会给出中位数......
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
你从不调用中值方法,你只定义它。
以下是我在 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
这里有几个问题:
end
关键字,不需要您在此处发布的内容。gets
返回一个字符串。例如,您可以收集以空格分隔的数字并从中创建一个数组。median
,这就是为什么它不会给你中位数。所以这样的事情会起作用:
def median(numbers)
sorted = numbers.sort
numbers[numbers.length/2]
end
p median(gets.split(' '))
这是家庭作业吗?
首先确保你的输入是你认为的。我将您的代码放在一个名为 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)