我是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)))
任何人都可以帮助我吗?
答案 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
>