Попытка определить функцию, которая обеспечивает минимальное целое число в списке чисел, ОСОБЕННО, используя циклы do (не do * или dolist, et c.) - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть задание для класса, специально проверяющее наше понимание do, с просьбой определить функцию для создания минимума списка чисел. Нас также просят использовать для этого вторичную функцию («поменьше»).

У меня нет предыдущего опыта кодирования, и я вынужден оставаться в пределах границ do; Я читал по этому вопросу столько, сколько могу, но почти все, что я нахожу, просто предлагает использовать другие методы (do *, COND, et c.).

Я определил простое «меньшее» как:

(defun smaller (x y)
  (if (< x y) x y))

Затем я подошел к проблеме следующим образом:

(defun minimum (lst)
  "(lst)
Returns the minimum of a list of numbers."
  (do ((numbers lst (cdr numbers))
       (min (car numbers) (smaller min (cadr numbers))))
      ((null numbers) min)))

Я чувствую, что есть проблема, когда «меньшее» msgstr "функция не может быть применена к первой l oop (обратная связь была бы отличной), в противном случае моя непосредственная проблема - ошибка" UNBOUND-VARIABLE "для переменной" NUMBERS ". Я не уверен, какая «область» вызывает путаницу: если я плохо отформатировал файл do l oop полностью, или один из второго / третьего / et c. «цифры» вызывает проблему.

Может ли кто-нибудь дать отзыв? - снова имея в виду, что мы ограничены только простыми циклами do и что у меня определенно нет полного понимания того, что у меня уже получилось.

Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Вы все еще можете ссылаться на numbers, пока используете do*, который является последовательным вариантом do. Тогда вам придется использовать car вместо cadr - теперь вы выбираете первое число из уже сокращенного списка. И вам нужно изменить конечное условие, чтобы не вызывать smaller с аргументом NIL - вы сможете легко это выяснить.

0 голосов
/ 03 февраля 2020

Do связывается параллельно, поэтому numbers не связывается, когда min является первой связью. Вы можете исправить это, используя (car lst) вместо (car numbers).

Вам нужно исправить условие конца: (cadr numbers) равно nil на последней итерации, вам нужно остановиться перед этим.

Для лучшей читаемости я бы предложил использовать first и second вместо car и cadr здесь.

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