Как мне заказать posns на основе увеличения значений posn-x и posn-y? - PullRequest
0 голосов
/ 14 марта 2019

Я должен отсортировать по возрастанию значений posn-x (т. Е. (make-posn -1 2) предшествует (make-posn 1 2). Если значения posn-x совпадают, то я должен рассмотреть posn-y и сделать то же самое.

Пример того, что ожидать:

(check-expect (posn-sort (list (make-posn 2 6)
                               (make-posn -2 6)
                               (make-posn -2 -6)))
                         (list (make-posn -2 -6)
                               (make-posn -2 6)
                               (make-posn 2 6)))

Любая помощь приветствуется, спасибо!

1 Ответ

2 голосов
/ 14 марта 2019

Вы можете использовать процедуру sort, передавая в качестве параметров список позиций и процедуру сравнения:

(define (posn-sort lst)
  (sort lst compare-posn))

Конечно, уловка заключается в том, чтобы написать правильный компаратор.Он получает в качестве параметров две позиции, и возвращает :

истинное значение, если первое меньше (т.е. должно быть отсортировано раньше), чем второе.

Для вашего случая это означает, что сначала мы должны сравнить x значения двух позиций, если это сравнение false, то мы сравниваем y значения.Сама процедура пишет:

(define (compare-posn p1 p2)
  (or (< (posn-x p1) (posn-x p2))
      (< (posn-y p1) (posn-y p2))))
...