我正在寫一個紅寶石腳本,將獲得數字和輸出的中位數。這是我的代碼幫助中位數在紅寶石
numbers = Array.new
numbers = [gets]
def median(numbers)
sorted = numbers.sort
mid = numbers.length/2 sorted[mid]
numbers.push mid
end
end
當你運行它,它要求的數字,但不會給中位數...
我正在寫一個紅寶石腳本,將獲得數字和輸出的中位數。這是我的代碼幫助中位數在紅寶石
numbers = Array.new
numbers = [gets]
def median(numbers)
sorted = numbers.sort
mid = numbers.length/2 sorted[mid]
numbers.push mid
end
end
當你運行它,它要求的數字,但不會給中位數...
這是一個家庭作業?
首先確保您的輸入是您認爲他們是。我把你的代碼放在一個名爲median.rb的文件中,然後運行rdebug。注意數字陣列的內容[變得]後
$ 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)
你永遠不會調用值法,你只定義它。
這裏有一些monkeypatches我可枚舉上使用,其中包括一個位數:
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(' '))
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
是的,這是一個家庭作業。教科書是廢話,並沒有真正的幫助。 – Help 2011-04-26 02:54:22