Как определить, находится ли список в Racket в порядке возрастания, убывания или нет? - PullRequest
0 голосов
/ 02 июля 2019

Мне нужно создать функцию, которая идентифицирует список в порядке увеличения или уменьшения. Если список в порядке возрастания, то функция выведет «по возрастанию», если список в порядке убывания, то функция выведет «по убыванию», если список не увеличивается или не уменьшается, выводится «смешанный».

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

(define (order? L)
  (cond
    [(empty? L) '()]
    [(> (first L) (first (rest L)))
     (order? (rest L)) "descending"]
    [(< (first L) (first (rest L)))
    (order? (rest L)) "ascending"]
    [else ("mixed")]))

Это 3 примера, которые показывают 3 разных случая.

(check-expect (order? (list 2 4 6 8)) "ascending")
(check-expect (order? (list 2 8 4 1 9 10 2)) "mixed")
(check-expect (order? (list 9 8 7 6 3 2)) "descending")

1 Ответ

1 голос
/ 02 июля 2019

На самом деле, для этой проблемы вам не нужно использовать рекурсию. Операторы <= и >= - это все, что вам нужно (< и > недостаточно, они потерпят неудачу, если есть повторяющиеся элементы):

(define (order? lst)
  (cond ((apply >= lst)  "ascending")
        ((apply <= lst) "descending")
        (else                "mixed")))

Вышеприведенное работает, потому что <= и >= принимают несколько параметров, и чтобы проверить, находится ли список в порядке возрастания, мы просто должны убедиться, что это правда:

(<= 2 4 6 8)
=> #t

И аналогично для нисходящего случая. Мы используем apply для передачи списка в качестве аргумента оператору, который поддерживает переменное число аргументов. Работает как положено:

(order? (list 2 4 6 8))
=> "ascending"
(order? (list 2 8 4 1 9 10 2))
=> "mixed"
(order? (list 9 8 7 6 3 2))
=> "descending"

Чтобы решить эту проблему с помощью рекурсии, вам в основном придется применить <= или >= к каждому элементу и следующему, останавливаясь, если вы обнаружите условие false.

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

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

...