2013-02-13 41 views
38

Làm cách nào để tính trung bình của một dãy số bằng Ruby?Tính trung bình trong Ruby

Tôi là người mới bắt đầu và trong quá trình học tập của mình Tôi đang cố gắng gắn bó với những gì đã được giảng dạy. Vì vậy, các câu hỏi khác mà tôi đã tìm thấy nằm ngoài phạm vi của tôi.

Dưới đây là ghi chú của tôi và cố gắng của tôi:

  1. loại mảng theo thứ tự tăng dần.
  2. tìm ra nếu nó là lẻ hoặc thậm chí là dài.
  3. nếu lẻ, chia độ dài mảng đã sắp xếp +1 thành một nửa. Đó là là chỉ số của trung vị. Trả về giá trị này.
  4. nếu thậm chí, tìm hai số giữa của mảng được sắp xếp và chia chúng thành 1/2. Trả lại giá trị này.
  5. Tìm hai số giữa:
  6. chia độ dài mảng đã sắp xếp làm đôi. Đây là chỉ số pt. số giữa đầu tiên.
  7. chia độ dài mảng đã sắp xếp + 2 thành một nửa. Đây là chỉ số pt. trong số số thứ hai ở giữa.
  8. lấy trung bình của hai số giữa này.

    def median(array) 
        ascend = array.sort 
        if ascend % 2 != 0 
        (ascend.length + 1)/2.0 
        else 
        ((ascend.length/2.0) + ((ascend.length + 2)/2.0)/2.0) 
        end 
    end 
    
+2

Câu hỏi thực tế là gì? –

+1

Đây là các câu hỏi: Viết một phương thức trung bình lấy một mảng các số làm đầu vào của nó và trả về giá trị trung bình. – tomgalpin

+1

Tôi muốn nói câu hỏi * của bạn là gì. Khi đặt câu hỏi bạn cần mô tả những gì được cho là xảy ra, những gì đang xảy ra mà lệch khỏi mong đợi và những gì bạn đã thử. –

Trả lời

69

Đây là một giải pháp mà hoạt động trên cả hai mảng chiều dài chẵn và lẻ và sẽ không làm thay đổi mảng:

def median(array) 
    sorted = array.sort 
    len = sorted.length 
    (sorted[(len - 1)/2] + sorted[len/2])/2.0 
end 
+0

Điều đó rất hữu ích. Cảm ơn. Tôi hiểu điều này. – tomgalpin

+0

'class Array def median được sắp xếp = self.sort ... end end' ...' [3,1,4,1,6] .median' –

2

Nếu bằng cách tính toán trung bình bạn có nghĩa là this

Sau đó

a = [12,3,4,5,123,4,5,6,66] 
a.sort! 
elements = a.count 
center = elements/2 
elements.even? ? (a[center] + a[center+1])/2 : a[center] 
+1

Sẽ không hoạt động trên một mảng có độ dài bằng nhau. – Reactormonk

+0

vâng, số thậm chí làm cho nó là nếu ... thủ tục khác (trong những gì tôi đã học được cho đến nay) – tomgalpin

+0

Không cần phải có nếu có, hãy xem câu trả lời của tôi – nbarraille

-2

I t hink rất tốt:

#!/usr/bin/env ruby 

#in-the-middle value when odd or 
#first of second half when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    sorted[middle] 
end 

hoặc

#in-the-middle value when odd or 
#average of 2 middle when even. 
def median(ary) 
    middle = ary.size/2 
    sorted = ary.sort_by{ |a| a } 
    ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0 
end 

tôi đã sử dụng sort_by chứ không phải là loại bởi vì nó nhanh hơn: Sorting an array in descending order in Ruby.

1

Tương tự như của nbarraille, nhưng tôi thấy nó một chút dễ dàng hơn để theo dõi những lý do tại sao một trong các công trình này:

class Array 
    def median 
    sorted = self.sort 
    half_len = (sorted.length/2.0).ceil 
    (sorted[half_len-1] + sorted[-half_len])/2.0 
    end 
end 

half_len = số yếu tố lên đến và bao gồm (đối với mảng với số lẻ các mặt hàng) giữa mảng.

Thậm chí đơn giản hơn:

class Array 
    def median 
    sorted = self.sort 
    mid = (sorted.length - 1)/2.0 
    (sorted[mid.floor] + sorted[mid.ceil])/2.0 
    end 
end 
0
def median(array) 
    half = array.sort!.length/2 
    array.length.odd? ? array[half] : (array[half] + array[half - 1])/2 
end 

* Nếu chiều dài là thậm chí, bạn phải thêm các điểm trung cộng với điểm trung - 1 vào tài khoản cho các chỉ số bắt đầu từ 0

+0

sử dụng 'array.sort!' Không phải là một ý tưởng hay vì nó sẽ thay đổi tham số – RainChen

1
def median(array)       #Define your method accepting an array as an argument. 
     array = array.sort      #sort the array from least to greatest 
     if array.length.odd?     #is the length of the array odd? 
     return array[(array.length - 1)/2] #find value at this index 
     else array.length.even?    #is the length of the array even? 
     return (array[array.length/2] + array[array.length/2 - 1])/2.to_f 
              #average the values found at these two indexes and convert to float 
     end 
    end 
+0

Có nhiều cách để làm điều này, nhưng câu trả lời của bạn là thanh lịch nhất. Rất rõ ràng những gì đang xảy ra. – SeattleDucati

+0

Nếu mảng.length không phải là số lẻ, thì ngay cả, hoặc nó có thể là cái gì khác ?, là nó cần thiết biểu thức sau khi khác ?, cũng là sự trở lại cần thiết? –

Các vấn đề liên quan