Для сортировки чисел в Лиспе


Я делаю упражнения для CS практику, в которой вы должны отсортировать три числа, используя только операторы if. Я написал следующий код на Лиспе и будет признателен за любые предложения, как улучшить мой код. Спасибо!

(defun generate-three ()
  (loop for l from 1 to 3 collect (random 25)))

(defun result (a b c) (format t "The sorted result is (~d,~d,~d)~%" a b c))

(let (a b c (the-three (generate-three)))
    (format t "~a ~%" the-three)
    (setq a (first the-three) b (second the-three) c (third the-three))
    (if (< a b)
      (if (< b c) (result a b c)
        (if (< a c) (result a c b) (result c a b)))
      (if (< a c) (result b a c)
        (if (< b c) (result b c a) (result c b a)))))

На основе обратной связи от комментаторов, пересмотренный код выглядит следующим образом:

(defun my-sort-3 (a b c)
    (if (< a b)
      (if (< b c) (list a b c)
        (if (< a c) (list a c b) (list c a b)))
      (if (< a c) (list b a c)
        (if (< b c) (list b c a) (list c b a)))))

(destructuring-bind (a b c) (loop repeat 3 collect (random 25))
  (format t "The sorted result of (~d,~d,~d) is ~a ~%" a b c (my-sort-3 a b c)))

Последняя итерация - обратите внимание на изменения в "формат" заявления:

(defun my-sort-3 (a b c)
    (if (< a b)
      (if (< b c) (list a b c)
        (if (< a c) (list a c b) (list c a b)))
      (if (< a c) (list b a c)
        (if (< b c) (list b c a) (list c b a)))))

(destructuring-bind (a b c) (loop repeat 3 collect (random 25))
  (format t "The sorted result of (~{~d~^, ~}) is (~{~d~^, ~})~%" (list a b c) (my-sort-3 a b c)))


2062
5
задан 7 марта 2011 в 02:03 Источник Поделиться
Комментарии
2 ответа

Это было время, так как я использовал Лисп, так что я не могу критиковать ваш код стиля или любые распространенные ошибки Лиспа.

Что сказал, Самая большая вещь, которую я замечаю здесь, что код для генерации 3 числа, упорядочив их и выводит результат все тесно связаны друг с другом. Я бы предложил определить отдельную функцию, которая принимает три числа и возвращает их в отсортированном порядке, которые затем могут быть объединены с существующей функции для создания трех чисел и печати трех чисел даст желаемый результат. Дополнительным преимуществом, конечно, является то, что эта функция сортировки в дальнейшем могут быть использованы для сортировки трех чисел, не только три, в этот кусок кода.

3
ответ дан 7 марта 2011 в 02:03 Источник Поделиться

Так как вы должны использовать , если, я не буду это комментировать кроме сказать, что Конд (или, что более вероятно, рекурсивный вызов) - это, наверное, правильный выбор.


Этот цикл используется в генерации-три чуть сложнее, чем вам нужно. Вы можете указать то, что вам нужно с (цикл повторяют 3 собирать (случайные 25)). Это достаточно короткий, что вам не понадобится промежуточная функция для этого упражнения. петля представляет собой довольно запутанную конструкцию (возможно, самый сложный в Лиспе). Если вы действительно хотите вступить в схватку с ним, прочитайте ХЛ Поваренная книга запись и Seibels петлю главу из практических общий Лисп.


Нет никакой необходимости объявлять переменные в Лиспе, поэтому А Б В (эффективно (ноль) (б нуля) (с нуля)) в первоначальном пусть высказывание ненужным. Поскольку единственная причина, по которой ты провозгласив эти шь переменных, чтобы назначить их позже, это будет хорошее место, чтобы использовать деструктурируется привязать

(destructuring-bind (a b c) (loop repeat 3 collect (random 25))
(format t "~a ~%" (list a b c))
(if (< a b)
(if (< b c)
(result a b c)
(if (< a c) (result a c b) (result c a b)))
(if (< a c)
(result b a c)
(if (< b c) (result b c a) (result c b a)))))


Есть ли особая причина, что вы не определили окончательное утверждение как функцию, которая принимает три аргумента (или три-элемент списка), а затем вызвать его? Также, есть ли причина, что ваша функция выводит обобщение приговор его результатов, а не возвращает отсортированный список? Обе эти очки сильно ограничивают возможность повторного использования кода. У вас, к примеру, определил это как мой-рода-3, вместо того, чтобы делать его голым дай позвонить, ты мог бы использовать ее в свой треугольник связанных с назначение.

Это также позволит в дальнейшем упростить код

(defun my-sort-3 (a b c)
(if (< a b)
(if (< b c)
(list a b c)
(if (< a c) (list a c b) (list c a b)))
(if (< a c)
(list b a c)
(if (< b c) (list b c a) (list c b a)))))

(format t "The sorted result is ~a~%"
(apply #'my-sort-3 (loop repeat 3 collect (random 25))))

2
ответ дан 7 марта 2011 в 05:03 Источник Поделиться