2015-02-27 5 views
0

Мне нужно получить максимальный и минимальный список в схеме. (Нам не разрешено использовать встроенные функции.) Что-то не так с кодом ниже. Я не уверен, что, может быть, с круглыми скобками. Может ли кто-нибудь помочь?Макс и мин в схеме

#lang racket 

(define (maxmin L) 
    (cond 
    ((null? L) '()) 
    ((null? (cdr L)) (list (car L) (car L))) 
    (else (let((mmtemp(maxmin (cdr L))) 
       (first (car L))) 
      (cond((> first (car mmtemp)) 
        (cons first(cdr mmtemp))) 
       ((< first (car mmtemp)) 
        (list (car mmtemp) first)) 
       else (temp))))))  

(maxmin 1 2 3) 
+0

Я принимаю его с помощью [ 'max'] (http://docs.racket-lang.org/reference/generic-numbers.html?q=max#%28def._%28%28quote._ ~ 23 ~ 25kernel% 29._max% 29% 29) не может быть и речи? ; p –

+0

right Мы не можем использовать функции max и min, которые имеют схему – programmingGirl

+0

«что-то не так». Вы имеете в виду, что вы получаете ошибку компиляции? Или код дает неожиданные результаты? Или есть ошибка? 'else (temp)' выглядит неправильно, небрежно. Не должно быть '(cond ... (else (temp)))'? Или '(cond ... (еще temp))'? (Я не уверен, должна ли temp быть функцией, которую вы хотите вызвать, или переменной, значение которой вы хотите вернуть.) –

ответ

1

Основная проблема здесь является последней строкой:

else (temp)))))) 

Скобок неверен здесь-else ключевого слова должно быть в пределах скобок. Изменение этого на это:

(else temp)))))) 

... исправляет алгоритм.

Вы также не звоните maxmin должным образом - ему нужен список, а не ряд параметров. Ваша окончательная строка программы должна быть следующей:

(maxmin '(1 2 3)) 

Эти изменения сделают вашу программу работоспособной.


Однако ваш код не очень идиоматический Racket. Это очень похоже на схему, и хотя Racket - это производная Scheme, это отдельный язык с собственным набором идиом.

Если вы хотите написать идиоматический код Racket, вы можете использовать квадратные скобки вместо круглых скобок в разных местах, чтобы облегчить читаемость. Кроме того, вы можете использовать first вместо car и rest вместо cdr для операций над списками, чтобы сделать вещи более ясными.

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

#lang racket 

(define (max-min lst) 
    (cond 
    [(null? lst) '()] 
    [(null? (rest lst)) 
    (list (first lst) (first lst))] 
    [else 
    (let ([rst (max-min (rest lst))] 
      [fst (first lst)]) 
     (cond 
     [(> fst (first rst)) 
      (cons fst (rest rst))] 
     [(< fst (first rst)) 
      (list (first rst) fst)] 
     [else rst]))])) 

(max-min '(1 2 3)) 
Смежные вопросы