Проверка последовательных номеров рекурсивно с использованием Lisp - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь написать рекурсивную функцию, чтобы проверить, последовательно ли увеличиваются элементы списка.

(defun test (lst)   
 (if (null lst)
   1
   (if (= (car lst) (1- (test (cdr lst))))
    1     
    0)))

(setq consecutive '(1 2 3 4))
(setq non-consecutive '(2 5 3 6))

Результаты:

CL-USER> (test non-consecutive)
0
CL-USER> (test consecutive)
0

(test consecutive)return 1. Как мне правильно написать эту функцию?

1 Ответ

0 голосов
/ 17 декабря 2018

Чтобы убедиться, что числа в последовательности последовательны , т. Е. Увеличиваются с шагом 1, вам необходимо:

(defun list-consecutive-p (list)
  (or (null (cdr list))
      (and (= 1 (- (second list) (first list)))
           (list-consecutive-p (rest list)))))

Затем

(list-consecutive-p '(1 2 3 4))
==> T
(list-consecutive-p '(1 4))
==> NIL
(list-consecutive-p '(4 1))
==> NIL

NB .Числа являются плохой заменой логических значений.

PS .Интересно, связано ли это с Как проверить, постоянно ли увеличиваются все числа в списке? ...

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