Lisp - проверка сортировки списка - PullRequest
1 голос
/ 10 апреля 2011

Я пытаюсь написать упорядоченную функцию Lisp, которая возвращает True, если список, который ей дан, отсортирован в порядке возрастания или убывания.

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

У меня возникают проблемы при вызове сравнения в моей заказанной (L) функции.Кажется, каждый раз уничтожает список.Может быть, вся моя реализация неверна.Спасибо за внимание!

(defun ascending (L)
   (sort L #'<)
)

(defun descending (L)
    (sort L #'>)
)

(defun compare (original sorted)
    (cond 
        ; I made this return the opposite for 
        ; easier usage in the condition of ordered
        ((equal original sorted) T) 
    )
)

(defun ordered (L) 
    ;(cond 
    (print L)
    (setq temp1 L)

    (compare L (ascending temp1))
    (print temp1)

    (print L)
    ;)
)

Ответы [ 4 ]

3 голосов
/ 20 ноября 2012

Как насчет:

(defun ordered (list)
  (apply #'< list))

Вы можете сделать его более общим, добавив параметр ключа:

(defun ordered (list &key (test #'<))
  (apply test list))
3 голосов
/ 10 апреля 2011

Вам не нужно сортировать список.

Вам просто нужно взглянуть на каждую пару последовательных элементов и посмотреть, все ли они восходящие или нисходящие.

Для простой трехлинейной работы вам понадобятся операторы or, every, >=, <= и rest. Помните, что список - это просто цепочка cons-ячеек, rest просто предоставляет ссылку на вторую ячейку, и что every может принимать несколько списков в качестве аргументов. Затем вы можете напрямую перевести описание проблемы в код на Лиспе.

2 голосов
/ 10 апреля 2011
  • зачем вам нужно COMPARE, когда все, что он делает, вызывает EQUAL с теми же аргументами?

  • TEMP1 - необъявленная переменная. Откуда это?

  • СОРТА разрушительна. Сначала вам нужно скопировать список.

Используйте ссылку на Лисп, такую ​​как Hyperspec и / или Краткий справочник по Common Lisp. Также есть несколько основных вводных книг для Lisp, таких как Common Lisp: Нежное введение в символьные вычисления .

1 голос
/ 10 апреля 2011

sort - разрушительная операция. Вы, вероятно, хотите что-то вроде этого, для ascending:

(defun ascending (L)
  (sort (copy-list L) #'<))

И нечто подобное для descending, конечно. Обратите внимание на последнее предложение на этой странице руководства: http://www.n -a-n-o.com / lisp / cmucl-tutorials / LISP-tutorial-22.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...