Условия 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)

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

  1. Создается новая переменная b и присваивается ей значение истина (t).
  2. Создается новая переменная c и присваивается ей значение ложь (nil).
  3. Используется конструкция or, которая возвращает первое истинное значение.
  4. Значение переменной b сравнивается с истиной (t).
  5. Если значение переменной b равно истине (t), то возвращается значение переменной b.
  6. Если значение переменной b не равно истине (t), то выполняется блок кода, заключенный в конструкцию cond.
  7. В блоке кода используется условное выражение истина (t), которое проверяет значение переменной c.
  8. Если значение переменной c равно истине (t), то возвращается значение переменной c.
  9. Если значение переменной c не равно истине (t), то возвращается значение переменной c, которое было присвоено в шаге 2.

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


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

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

11   голосов , оценка 3.727 из 5