Вот своего рода шаблон, в котором изложен подход к проблеме.
(defun out-of-order (list)
(labels ((recur (list index)
(cond ((or #<list is empty> #<list only has one item>)
nil)
((> #<the first item> #<the second item>)
index)
(t
(recur #<advance the recursion> #<increment the index>)))))
(recur list 0)))
Подумайте о частях процесса (#<these things>
) сами по себе, а также как каждый из них вносит вклад в решение. Заполнение их приведет вас к решению, и я думаю, что также поможет вам лучше понять рекурсивные процедуры.
Конечно, прокомментируйте, если есть какие-либо детали, которые неясны.
Если вы не знакомы с labels, вот той же самой логикой, но с использованием вместо внешней процедуры помощника:
(defun out-of-order-aux (list index)
(cond ((or #<list is empty> #<list only has one item>)
nil)
((> #<the first item> #<the second item>)
index)
(t
(out-of-order-aux #<advance the recursion> #<increment the index>))))
(defun out-of-order (list)
(out-of-order-aux list 0))
Покажите код, который у вас есть прямо сейчас. Кроме того, если это домашнее задание, отметьте его тегом «домашняя работа». –
его просто небольшая часть домашней работы, которую я пишу, и, похоже, для меня не должно быть домашней теги, чтобы добавить – Cristiano
Предположим ли вы, что это общий язык? Что вернуть, если совпадение не найдено? – Sylwester