2010-04-30 4 views
1

Проблема в этот раз, чтобы получить медиану трех значений (легкий)Получение медиану 3 значений по схеме в

Я сделал это:

(define (med x y z) (car(cdr(x y z))) 

и был принят, но при тестировании его:

(med 3 4 5) 

Я получаю эту ошибку:

Error: attempt to call a non-procedure
(2 3 4)

И при вводе букв вместо номера я получаю:

(md x y z) 

Error: undefined varia
y
(package user)

Используя что-нибудь, кроме А я получаю:

(md d l m) 

Error: undefined variable
d
(package user)

вопрос был удален не знает, как так или иначе

Напишите функцию, которая возвращает медиана 3 значений

Извините за редактирование вопроса, который я получил, что я должен поставить значения в порядке первый не только подоконник автомобиля и корды вещи, поэтому я так и сделал

33> (define (med x y z) 
    (if(and(

     (<x y) (<y z) y 

       if(and(

        (<y x) (<x z) x z))))) 

Warning: invalid expression 
     (if (and< (<x y) (<y z) y if (and ((<y x) (<x z) x z)))) 

, но как у видеть Im получить предупреждение, так что же это такое?

+0

Был ли у вас вопрос ...? –

+0

Я бросил «что не так?» с конца, когда я его отредактировал; не вопрос очевиден? Он получает три сообщения об ошибках и не ожидает –

ответ

1

Следует отметить, что, как это определено, (med . rest) эквивалентно (cadr rest) (за исключением того, med принимает только три значения). Лично я ожидал бы функцию, которая должна вернуть медианную значения для возврата, ну, median, независимо от порядка списка. Например, (med 4 2 5) вернуться бы 4 и (3 0 9 6 5) вернется 5.

Что касается синтаксической ошибки (что не имеет значения, так много для написания med, так как это лучший способ использования sort, length и list-ref), вы дон У вас есть скобки в правильных местах. Вот еще один способ записи, что у вас есть сейчас, выстраиваются в очередь термины со своими братьями и сестрами и справа от своих предков:

(if (and (
      (<x y) 
      (<y z) 
      y 
      if 
      (and (
        (<y x) 
        (<x z) 
        x 
        z 
) ) )) ) 

Формат if является:

(if test-expr true-expr false-expr) 

Все ваши условия суб -термс условного, и нет true-expr или false-expr.Вы хотели бы написать свой код, как:

(if (and ...) 
    y 
    (if (...) ; we know that (not (and (< x y) (< y z)) 
     x 
     z)) 

Обратите внимание, что вы могли бы быть квалифицированно в simplfy поздних тестов, так как вы знаете, ранние тесты являются ложными.

Вы также можете использовать cond, которое яснее, чем вложенная последовательность if с:

(cond (test result) 
     (test result) 
     (test result) 
     ...) 

Для вашего кода, это будет:

(cond ((and ...) y) 
     ((...) x) 
     (else z)) 

Там нет ничего особенного о else (это скорее синтаксическая конструкция, чем выражение, а не то, что она имеет значение). Вы можете использовать любое значение, которое оценивается как true (например, #t).

Помните, что круглые круглые скобки окружают как функцию, так и аргументы в Lisp ((foo 1 2 3), а не foo(1, 2 ,3)), в отличие от математических обозначений, где круглые скобки окружают только аргументы.

+0

@ outis да да точно Im делает это таким образом, но Im потерял с IFs и ANDs и ORs ... –

+0

@kristian: попробуйте сначала отсортировать список. После этого это легко. – outis

+0

@ outis Я сказал, что сказал, и я пробовал делать это, но все еще испытываю проблемы –

5

Вы, вероятно, хотите, чтобы создать список, как это:

(define (med x y z) (car(cdr(list x y z))) 

Однако, похоже, отходы укутаться значения в список только, чтобы отменить их снова. Это будет иметь тот же эффект:

(define (med x y z) y) 
0

в то время как outis сделал очень хорошую работу по разъяснению вопроса, есть еще один важный бит вам нужно знать

(<x y) 

вызывает функцию с именем < х с параметром у. вам нужно убедиться, что вы добавили пробел между < и x, например:

(< x y) 
Смежные вопросы