2014-11-02 7 views
0

Я пытаюсь проверить, отсортирован ли список. Если он отсортирован, верните True, иначе верните False. Однако этот код всегда возвращает True, и я не уверен, как его исправить.Проверьте, отсортирован ли список на схеме

(define (ordered? lst) 
    (cond (if (null? lst) #t) 
      ((> (car(cdr(lst))) car(lst)) 
      (apply increasing? cdr(lst))) 
      (else #f)) 
) 

ответ

0

Давайте подумаем о том, что делает ваш код.

Прежде всего, избавиться от if, это необязательно в предложении cond. Далее у вас есть некоторые не-схема функции вызова происходит:

 ((> (car(cdr(lst))) car(lst)) 

Должно быть:

((> (car (cdr lst)) (car lst)) 

Теперь вы обычно не используют apply в такого рода образом. Вместо этого я бы использовал рекурсию.

Так что:

 (apply increasing? cdr(lst))) 

становится:

(ordered (cdr lst))) 

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

Далее мы хотим, чтобы проверить в случае, что этот конкретный экземпляр не сортируется так:

(else #f)) 

отлично.

Всего:

(define (ordered? lst) 
     (cond ((null? lst) #t) 
      ((eq? (length lst) 1) #t) 
     ((> (car (cdr lst)) (car lst)) 
     (ordered? (cdr lst))) 
     (else #f)) 
    ) 
+0

это дает мне ошибку несвязанной переменной упорядоченных, так как я не определяло заказал. поэтому я меняю заказы? но я получил еще одну ошибку, говорящую «автомобиль: неправильный тип аргумента». – sunnysmiling

+0

О, да, вам также нужно беспокоиться о списках одноэлементных ... Я обновил все. – Dair

0

Вы не можете использовать if внутри cond. Первая строка должна быть:

(cond ((null? lst) #t) 

Ваш код испытывало ли if верно. Поскольку это всегда верно, это предложение было обработано и оно было возвращено #t.

Смежные вопросы