1

我是 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)))

谁能帮我?

4

2 回答 2

2

第一件事:'median-interactive'不应该称为'median'吗?

事情二:我强烈敦促您开发完全独立于“中位数交互”的“中位数”。

第三件事:你能举例说明中位数的作用吗?具体来说,您如何称呼“中位数”以及它应该返回什么的具体示例?

事情四:我猜这是作业?

于 2011-02-27T21:38:14.657 回答
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
> 
于 2011-02-28T17:20:19.923 回答