如何在方案中找到列表的中位数

时间:2011-02-27 20:43:31

标签: lisp scheme computer-science median

我是Scheme新手,我正在使用Dr.Racket试图找到列表的中位数。

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

我正在使用R 6 RS方案规范,允许使用get-line

这是我到目前为止所做的:

#!r6rs
(import (rnrs))

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

事情一:不应该'中位互动'称'中位'?

事情二:我强烈建议你完全独立于'中位互动'来发展'中位数'。

三件事:你能提供中位数的例子吗?具体来说,你可以如何调用'中位数'以及它应该返回什么的具体例子?

第四件事:我猜这是作业?

答案 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
>