Как найти медиану списка в схеме - PullRequest
0 голосов
/ 27 февраля 2011

Я новичок в Схеме и использую Dr.Racket, чтобы попытаться найти медиану списка.

Например, (median 2 1 3) должен вернуть 2, а (median 1 1 5 5 2 3) должен вернуть 2.5.

Я использую спецификацию схемы RS R 6 и мне разрешено использовать get-line.

Вот что у меня есть:

#!r6rs
(import (rnrs))

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

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Вот упрощенная реализация. Поскольку медиана - это просто точка, в которой половина значений находится выше, а половина - ниже, вы можете отсортировать список и найти среднюю точку. В зависимости от того, является ли количество элементов нечетным или четным, вы можете выбрать среднюю точку в отсортированном списке (нечетное) или среднее значение двух средних точек (четное)

(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
> 
1 голос
/ 28 февраля 2011

Одна вещь: разве медиана-интерактив не должен называться «медиана»?

Вторая вещь: я настоятельно призываю вас развивать «медиану» совершенно независимо от «медиан-интерактивной».

Дело три: можете ли вы привести примеры того, что делает медиана?Конкретно, конкретные примеры того, как вы могли бы назвать «медиану» и что она должна возвращать?

Четвертая вещь: я предполагаю, что это домашняя работа?

...