Определение процедуры between - Lisp

Узнай цену своей работы

Формулировка задачи:

Определить процедуру between(N1, N2, X), которая порождает все целые числа X, отвечающие условию N1 < X < N2. Дали такую задачу... прошу вашей помощи.

Решение задачи: «Определение процедуры between»

textual
Листинг программы
(defun betwixt (n m)
  (when (< n m) (betwixt- n m)))
 
(defun betwixt- (n m &optional ac &aux (z (1+ n)))
  (if (< z m) (betwixt- (1+ n) m (cons z ac))
      (nreverse ac)))
 
> (betwixt 4 7)
(5 6)

Объяснение кода листинга программы

В коде определены две процедуры: betwixt и betwixt-. betwixt — это вводная процедура, которая проверяет, является ли первый аргумент (n) меньше второго (m). Если это так, то она вызывает процедуру betwixt- с аргументами n, m и результатом (n+1) в качестве третьего аргумента. Если же n больше или равно m, то betwixt просто завершается. betwixt- — это вспомогательная процедура, которая принимает четыре аргумента: n, m, ac (результат) и z (счётчик). Если z меньше m, то betwixt- вызывает саму себя, увеличивая значение n на 1 и добавляя z в начало результата (ac). Значение ac затем переходит в betwixt-. Если же z больше или равно m, то betwixt- вызывает betwixt, передавая n, m и ac в качестве аргументов. В этом случае ac также передается как результат, который был получен во время вызова betwixt-. В итоге, если мы вызываем betwixt с аргументами 4 и 7, то результатом будет вызов betwixt- с аргументами 4, 7 и пустым списком (ac). Поскольку 4 меньше 7, то betwixt- вызовет сама себя с аргументами 5, 7 и (5 . ac). Затем она добавит 5 в начало ac и вызовет betwixt- с аргументами 6, 7 и (5 6 . ac). В этом случае ac будет передан как результат, и поскольку 6 больше или равно 7, то betwixt вызовет betwixt- с аргументами 6, 7 и (5 6 . ac). Но в этот раз ac уже будет являться результатом, поэтому он будет передан в betwixt без изменений. В результате мы получим (5 6), что является правильным ответом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы