Условия IF и COND - Lisp
Формулировка задачи:
Всегда ли IF можно заменить COND?
какие особенности замены в рекурсий?
(defun make-heap (&optional (length 7)) (make-array length :adjustable t :fill-pointer 0)) (defun left-index (index) (1- (* 2 (1+ index)))) (defun right-index (index) (* 2 (1+ index))) (defun parent-index (index) (floor (1- index) 2)) (defun percolate-up (heap index predicate) (if (zerop index) heap (do* ((element (aref heap index)) (index index pindex) (pindex (parent-index index) (parent-index index))) ((zerop index) heap) (if (funcall predicate element (aref heap pindex)) (rotatef (aref heap index) (aref heap pindex)) (return-from percolate-up heap))))) (defun heap-insert (heap element predicate) (let ((index (vector-push-extend element heap 2))) (percolate-up heap index predicate))) (defun percolate-down (heap index predicate) (let ((length (length heap)) (element (aref heap index))) (flet ((maybe-element (index) "return the element at index or nil, and a boolean indicating whether there was an element." (if (< index length) (values (aref heap index) t) (values nil nil)))) (do ((index index swap-index) (lindex (left-index index) (left-index index)) (rindex (right-index index) (right-index index)) (swap-index nil) (swap-child nil)) (nil) ;; Extact the left child if there is one. If there is not, ;; return the heap. Set the left child as the swap-child. (multiple-value-bind (lchild lp) (maybe-element lindex) (if (not lp) (return-from percolate-down heap) (setf swap-child lchild swap-index lindex)) ;; Extract the right child, if any, and when better than the ;; current swap-child, update the swap-child. (multiple-value-bind (rchild rp) (maybe-element rindex) (when (and rp (funcall predicate rchild lchild)) (setf swap-child rchild swap-index rindex)) ;; If the swap-child is better than element, rotate them, ;; and continue percolating down, else return heap. (if (not (funcall predicate swap-child element)) (return-from percolate-down heap) (rotatef (aref heap index) (aref heap swap-index))))))))) (defun heap-empty-p (heap) (eql (length heap) 0)) (defun heap-delete-min (heap predicate) (assert (not (heap-empty-p heap)) () "Can't pop from empty heap.") (prog1 (aref heap 0) (setf (aref heap 0) (vector-pop heap)) (unless (heap-empty-p heap) (percolate-down heap 0 predicate)))) (defun heapsort (sequence predicate) (let ((h (make-heap (length sequence)))) (map nil #'(lambda (e) (heap-insert h e predicate)) sequence) (map-into sequence #'(lambda () (heap-delete-min h predicate)))))
Решение задачи: «Условия IF и COND»
textual
Листинг программы
(or b c)
Объяснение кода листинга программы
- Создается новая переменная
b
и присваивается ей значениеистина
(t). - Создается новая переменная
c
и присваивается ей значениеложь
(nil). - Используется конструкция
or
, которая возвращает первоеистинное
значение. - Значение переменной
b
сравнивается систиной
(t). - Если значение переменной
b
равноистине
(t), то возвращается значение переменнойb
. - Если значение переменной
b
не равноистине
(t), то выполняется блок кода, заключенный в конструкциюcond
. - В блоке кода используется условное выражение
истина
(t), которое проверяет значение переменнойc
. - Если значение переменной
c
равноистине
(t), то возвращается значение переменнойc
. - Если значение переменной
c
не равноистине
(t), то возвращается значение переменнойc
, которое было присвоено в шаге 2.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д