2011-02-27 52 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 
>