2014-11-26 4 views
0

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

Если длина списка L нечетна, функция median возвращает медианный элемент в списке. Если длина L четно, то функция возвращает 0. медиана пример

(median ‘(1)) returns 1 
(median ‘(1 2)) returns 0 
(median ‘(1 2 3)) returns 2 
(median ‘(1 2 3 4) returns 0 

я только разрешено использовать

- null? 
- car 
- cdr 
- else 
- = 
- + 
- median 
- cond 
- if 
- user defined names (for my variables) 
- integer literals 
- parentheses 

Есть идеи?

+3

Пожалуйста, не хулиганить свои сообщения после того, как вы получили ответы от людей - она ​​останавливает будущих читателей от выгоды от своего времени. – Flexo

ответ

2

Эта проблема может быть решена с использованием tortoise and hare algorithm, если допускается внутренняя процедура помощника - нам нужно передать два параметра для этого. Кроме того, исполняются все ограничения:

(define (median lst) 
    (define (median tortoise hare) 
    (cond ((null? hare) 0) 
      ((null? (cdr hare)) (car tortoise)) 
      (else (median (cdr tortoise) (cdr (cdr hare)))))) 
    (median lst lst)) 

Он работает, как ожидалось:

(median '(1))  ; returns 1 
(median '(1 2))  ; returns 0 
(median '(1 2 3)) ; returns 2 
(median '(1 2 3 4)) ; returns 0 
+0

Спасибо и так много, что было полезно – CCC

+0

Мы не имеем права использовать две функции ... это должно быть что-то вроде (определить медиану (лямбда (<список L следуют параметры вашего выбора изначально установлен на ноль>) (cond ))) и он должен иметь только одну рекурсивную функцию ... есть ли способ? – CCC

+0

Не могли бы вы помочь в этом. Я застрял . – CCC