2011-02-27 33 views
0

我是Scheme新手,我正在使用Dr.Racket來嘗試查找列表的中位數。如何在計劃中找到列表的中位數

例如,(median 2 1 3)應返回2(median 1 1 5 5 2 3)應返回2.5

我正在使用R RS方案規範並允許使用get-line

這是我到目前爲止有:

#!r6rs 
(import (rnrs)) 

(define (median-interactive lst) 
    (display "Enter input:") 
    (let ((input (get-line (current-input-port)))) 
    (list-sort < lst))) 

誰能幫助我?

+0

請注意[中位數](http://en.wikipedia.org/wiki/Median)不同於[平均數](http://en.wikipedia.org/wiki/Arithmetic_mean)(平均數)值 – 2011-02-27 21:19:17

+0

我有中位數的奇數元素在列表中工作,但它不適用於偶數個元素 任何人都可以幫助我,告訴我我的偶函數有什麼問題嗎? – Spizzy 2011-02-27 22:50:16

回答

1

事情一:不應該'中位數交互式'調用'中位數'?

事情二:我強烈建議你開發完全獨立於「中位互動」的「中位數」。

第三件事:你能提供一下中位數的例子嗎?具體來說,你可以稱之爲「中位數」以及它應該返回的具體例子。

事情四:我猜這是作業嗎?

1

這是一個簡單的實現。由於中位數只是數值的一半以上和一半以下的點,因此您可以對列表進行排序並找到中間點。根據元素的數量是否是奇數還是偶數,你可以乘坐在排序列表中的中間點(奇數)或兩個中間點(偶數)的平均

(define (median lst) 
    (let ((len (length lst)) 
     (nlst (sort lst >))) 
    (if (even? len) 
     (/ (+ (list-ref nlst (/ len 2)) 
       (list-ref nlst (- (/ len 2) 1))) 2) 
     (list-ref nlst (truncate (/ len 2)))))) 

如果是這樣的功課,這樣的討厭的版本可能會讓你成爲'D',但它確實有效。

> (median (list 5 2 6 2)) 
3 1/2 
> (median (list 5 2 6 3 1)) 
3 
>