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