Я новичок в Scheme, и я ударил стену. У меня есть мои сортировки и средние функции, и я пытаюсь изменить медианную функцию, которую я нашел на этом сайте. Однако, независимо от того, что я пытаюсь, я продолжаю получать ошибки, когда у меня есть более одного выражения в медианной функции, или когда я пытаюсь использовать сортировку в медианной функции, она «неопределена».Scheme - Как найти медиану, используя пользовательские сортировки и средние функции?
(define (sort1 L)
(if (or (null? L) (<= (length L) 1)) L
(let loop ((l null) (r null)
(pivot (car L)) (rest (cdr L)))
(if (null? rest)
(append (append (sort1 l) (list pivot)) (sort1 r))
(if (<= (car rest) pivot)
(loop (append l (list (car rest))) r pivot (cdr rest))
(loop l (append r (list (car rest))) pivot (cdr rest)))))))
(define (avg lst)
(let loop ((count 0) (sum 0) (args lst))
(if (not (null? args))
(loop (add1 count) (+ sum (car args)) (cdr args))
(/ sum count))))
(define (median L)
(if (null? L) (error "The list is empty")
(let loop ((L1 L) (L2 L))
(cond ((null? (cdr L2)) (car L1))
((null? (cddr L2)) (list (car L1) (cadr L1)))
(else (loop (cdr L1) (cddr L2)))))))
Я пытаюсь изменить медиану функции первой сортировки списка, и если есть четное число элементов, мне нужно взять среднее из списка и использовать элемент ближе к среднему ,
Любая помощь будет оценена, спасибо заранее.
Я вижу много основных ошибок в скобках. Например, в определении «медианный» есть два парагона перед первым «let», который вы, вероятно, не намеревались, и есть также два parens после '(sort1 lst)', что означает, что это 'let' отсутствует тело. Тогда вам также не хватает пара до «let loop». Исправьте их, а затем задайте свой реальный вопрос. Помните, что круглые скобки обычно означают применение функции. –
Я вернул их в свой исходный код, и все это должно быть исправлено, потому что функция работает сейчас - но мне нужно, чтобы он сортировал входной список, и должен ли список содержать четное число элементов, чтобы вернуть элемент (из двух средних элементы), которые ближе всего к среднему. –
Если вы хотите сделать что-то одно, то сделайте еще один, это функциональная композиция. Итак, вы хотите отсортировать список, а затем применить эту медианную функцию? Переименуйте медианную функцию в 'median/sorted' и определите реальную функцию median как состав' sort1' и 'median/sorted'. –