Definir funciones en Common Lisp

Estoy intentando entender Комо funciona язык Common LISP, y mirando unos ejercicios. Encuentro que se определяет ООН árbol макс. минута, Комо sigue:

(max ((min (4 5))
(min (6
(max (3 4))
(max (7 9))))
(min (3 8)))))

Устройство определения Se pide варьируется funciones en Common Lisp.

En la primera se pide retornar un boleano que nos indica si el árbol es una hoja (número) o нет.

Он escrito алгоритм Комо esto, mirando различные руководства que он encontrado en internet, pero никакая sé СИ es correcto, o нет.

 (defun hoja-arbol (hoja)
 (numerp hoja))

Сын Otras que se piden:

  • retorna un número si el árbol es una hoja, ноль en otro caso retorna

  • retorna ООН booleano, минута indica si la raíz del árbol es

  • retorna ООН booleano, indica si la raíz del árbol es макс.

  • retorna la lista de hijos si el árbol никакой es una hoja, ноль en otro caso retorna

СИ alguien я pudiera orientar, para intentar generar las funciones que me piden, estaría muy agradecido.

1
задан 03.04.2017, 12:37
1 ответ

Прицел эта ссылка: https://sobrelisp.blogspot.com/2013/02/arboles-binarios-en-lisp.html

В первой просит у себя возвращать boleano, который показывает нам, если ГЎrbol - лист (nГєmero) или нет.

(defun es-hoja (arbol)
  "retorna un boleano que indica si el árbol es una hoja"
  (if (and (listp arbol) (not (cdr arbol)))  
      t
    nil))

(defvar arbol '(1 . ((2 . nil) . (3 . nil)))) ; => ARBOL
(es-hoja arbol) ; => NIL
(es-hoja '(4)) ; => T

retorna un número si el árbol es una hoja, en otro caso retorna nil

(defun numero-es-hoja (n)
  "retorna un número si el árbol es una hoja, en otro caso retorna nil"
  (if (es-hoja n)
      (car n)
    nil))

(defvar arbol '(1 . ((2 . nil) . (3 . nil)))) ;; => ARBOL
(numero-es-hoja '(4)) ;; => 4
(numero-es-hoja arbol) ;; => NIL
(numero-es-hoja '(5)) ;; => 5

возвращает booleano, показывает, она raГ-z ГЎrbol ли он min

(defun es-raiz-min (arb &optional raiz)
  "retorna un booleano, indica si la raíz del árbol es min"
  (if (not raiz) (setq raiz (car arb)))
  (let ((x (car arb)))
    (cond ((eq x nil)
       t)
      ((numberp x)
       (if (< x raiz)
           nil
         (es-raiz-min (cdr arb) raiz)))
      ((es-hoja x)
       (if (< (car x) raiz)
           nil
         (es-raiz-min (cdr arb) raiz)))
      (t
       (if (and (es-raiz-min (car arb) raiz) (es-raiz-min (cdr arb) raiz))
           t
         nil)))))

(setq arbol1 '(3 . ((2 . ((5 . nil) . (6 . nil))) . (1 . nil))))
(setq arbol2 '(10  .  ((2 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))
(setq arbol3 '(1 . ((2 . nil) . (3 . nil))))
(setq arbol4 '(4  .  ((32 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))

(es-raiz-min arbol1) ; => NIL
(es-raiz-min arbol2) ; => NIL
(es-raiz-min arbol3) ; => T
(es-raiz-min arbol4) ; => NIL

возвращает booleano, показывает, она raГ-z ГЎrbol ли он max

(defun es-raiz-max (arb &optional raiz)
  "retorna un booleano, indica si la raíz del árbol es max"
  (if (not raiz) (setq raiz (car arb)))
  (let ((x (car arb)))
    (cond ((eq x nil)
       t)
      ((numberp x)
       (if (> x raiz)
           nil
         (es-raiz-max (cdr arb) raiz)))
      ((es-hoja x)
       (if (> (car x) raiz)
           nil
         (es-raiz-max (cdr arb) raiz)))
      (t
       (if (and (es-raiz-max (car arb) raiz) (es-raiz-max (cdr arb) raiz))
           t
         nil)))))

(setq arbol1 '(3 . ((2 . ((5 . nil) . (6 . nil))) . (1 . nil))))
(setq arbol2 '(10  .  ((2 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))
(setq arbol3 '(1 . ((2 . nil) . (3 . nil))))
(setq arbol4 '(4  .  ((32 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))
(setq arbol5 '(32  .  ((32 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))

(es-raiz-max arbol1) ; => NIL
(es-raiz-max arbol2) ; => T
(es-raiz-max arbol3) ; => NIL
(es-raiz-max arbol4) ; => NIL
(es-raiz-max arbol5) ; => T

возвращает список детей, если ГЎrbol не лист, в другом случае возврати nil

(defun lista-hijos (arb &optional es-hijo hijos)
  "retorna la lista de hijos si el árbol no es una hoja, en otro caso retorna nil"
  (let ((x (car arb)))
    (cond ((eq x nil)
       (reverse hijos))
      ((numberp x)
       (if es-hijo
           (push x hijos))
       (lista-hijos (cdr arb) t hijos))
      ((es-hoja x)
       (if es-hijo
           (push (car x) hijos))
       (lista-hijos (cdr arb) t hijos))
      (t
       (lista-hijos (cdr arb) t (reverse (lista-hijos x t hijos)))))))

(setq arbol0 '(1))
(setq arbol1 '(1 . ((2 . ((5 . nil) . (6 . nil))) . (3 . nil))))
(setq arbol2 '(1  .  ((2 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))
(setq arbol3 '(1 . ((2 . nil) . (3 . nil))))
(setq arbol4 '(1  .  ((32 . ((4 . nil) . (5 . nil)))  .  (3 . ((6 . nil) . (7 . nil))))))

(lista-hijos arbol0) ; => NIL
(lista-hijos arbol1) ; => (2 5 6 3)
(lista-hijos arbol2) ; => (2 4 5 3 6 7)
(lista-hijos arbol3) ; => (2 3)
(lista-hijos arbol4) ; => (32 4 5 3 6 7)
0
ответ дан 24.11.2019, 10:14