На этом шаге мы введем понятие взаимной рекурсии и проиллюстрируем ее использование.
Если две или более функций вызывают друг друга, то рекурсия называется взаимной. К сожалению, нам удалось подобрать лишь один содержательный пример взаимной рекурсии!
(DEFUN ISPOS (LAMBDA (LST)
(COND ( (NULL LST) NIL )
( (AND (NULL (CDR LST)) (EQ (CAR LST) -)) T )
( (EQ (CAR LST) -) (ISNEG (CDR LST)) )
( (EQ (CAR LST) +) (ISPOS (CDR LST)) )
)
))
;------------------------
(DEFUN ISNEG (LAMBDA (LST)
(COND ( (NULL LST) NIL )
( (AND (NULL (CDR LST)) (EQ (CAR LST) +)) T )
( (EQ (CAR LST) -) (ISPOS (CDR LST)) )
( (EQ (CAR LST) +) (ISNEG (CDR LST)) )
)
))
Замечание. О программировании вложенных циклов. Соответствующие вложенным циклам императивного программирования многократные повторения в функциональном программировании осуществляются обычно с помощью двух или более функций, каждая из которых соответствует простому циклу. Вызов такой рекурсивной функции используется в определении другой функции в качестве аргумента ее рекурсивного вызова.
На следующем шаге мы поговорим о рекурсии высших порядков.