Skip to content

Tema 1

Exercicis bàsics

Calculau 553+47553 + 47

(+ 553 47)
> 600

Calculau 38670+38386 – 70 + 38

(+ (- 386 70) 38)
> 354

Calculau: 434^{3}

(expt 4 3)
> 64
(* 4 4 4)
> 64
(* 4 ( * 4 4))
> 64

Calculau 1024+23(273+1)1024 + 2^{3} - (\dfrac{27}{3} + 1)

(+ 1024 (expt 2 3) (- (/ 27 3) 1))
> 1039
(+ 1024 (* 2 (* 2 2)) (- (+ (/ 27 3) 1)))
> 1039

Manipulació de llistes

Les operacions bàsiques són el CAR i el CDR – El CAR retorna el primer element d’una llista – El CDR retorna el resta de la llista (sense el primer element).

(car '(a b c d))
> a
;pot ser un àtom o una llista
(cdr '(a b c d))
> (b c d)
;sempre és una llista

Obteniu el segon elemente de la llista (a b c d): b

(car (cdr '(a b c d)))
> b

Obteniu el tercer elemente de la llista (a b c d): c

(car (cdr (cdr '(a b c d))))
> c

Podem trobar funcions amb el ormat CxxxR on x és una A o una D que permeten la composició de CAR i CDR per obtenir el segon, el tercer, etc.

;cadr == car(cdr)
(cadr '(a b c d))
> b
;caddr == car(cdr(cdr))
(caddr '(a b c d))
> c

Altres funcions són:

  • null : mira si una llista és buida o no.
  • append: s’utilitza per afegir dues llistes.
  • member: mira si un element pertany a una llista.
  • delete: borra un element d’una llista.
  • reverse: inverteix una llista.

Eliminau l’element b de la llista (a b c d)

(delete 'b '(a b c d))
> (a c d)

Afegiu les llistes (a b) i (a b c d): (a b a b c d)

(append '(a b) '(a b c d))
> (a b a b c d)

Afegiu l’element a a la llista (b c d): (a b c d)

(append '(a) '(b c d))
> (a b c d)

Construcció de llistes

Per construir llistes es poden utilitzar el CONS i el LIST.

  • CONS afegeix un nou element al principi d’una llista donada
(cons 'a '(b c d))
> (a b c d)
(cons '(1 2) '(b c d))
> ((1 2) b c d)
  • LIST crea una llista a partir del seus arguments
(list 'a 'b 'c 'd)
> (a b c d)

Afegiu l’element a a la segona posició de la llista (b c d): (b a c d)

(cons (car '(b c d)) (cons 'a (cdr '(b c d))))
> (b a c d)
(append (list (car '(b c d)) 'a) (cdr '(b c d)))
> (b a c d)

Assignacions

Encara que la seva utilització no és massa aconsellada, es poden donar valors als àtoms directament amb dues funcions: SET i SETQ

  • SETQ vol dir “set quote” i permet assignar un valor a un àtom.
(setq ciutats '(palma inca manacor))
> (palma inca manacor)
(set 'ciutats '(palma inca manacor))
> (palma inca manacor)

Diferència EQUAL i EQ

  • EQ mira si dos àtoms són iguals.
  • EQUAL mira si dues llistes són iguals.
(set 'l1 '(a b c))
> (a b c)
(set 'l2 l1)
> (a b c)
(set 'l3 '(a b c))
> (a b c)
(eq l1 l2)
> t
(eq l1 l3)
> nil
(eq l2 l3)
> nil
(equal l1 l2)
> t
(equal l1 l3)
> t
(equal l2 l3)
> t

Definició de noves funcions

Les funcions es poden definir amb la instrucció DEFUN. El format és el següent:

(defun nom-de-funció parametres expressió)

Exemple:

(defun suma1 (x) (+ x 1))
> suma1
(suma1 4)
> 5

Escriu la funciço quadrat, que calculi el quadrar d’un nombre

(defun quadrat (x) (* x x))
> quadrat
(quadrat 4)
> 16

Escriu la funció suma3, que calculi la suma de tres nombres

(defun suma3 (x y z) (+ x y z))
> suma3
(suma3 4 5 5)
> 14

Escriu la funció tercer, que retorni el tercer element d’una llista

(defun tercer (l) (car (cdr (cdr l))))
> tercer
(tercer '(a b c ))
> c

Escriu la funció darrer, que retorni l’últim element d’una llista

(defun darrer (l) (car (reverse l)))
> darrer
(darrer '(a b c d))
> d

Recursivitat

Per poder definir recursivament una funció necessitarem una instrucció condicional que ens permeti determinar quan s’acaba la recursivitat.

Expressions condicionals

(cond (condició-1 acció-1)
(condició-2 acció-2)
(condició-3 acció-3)
...
(condició-n acció-n) )

S’avalua l’acció corresponent a la primera condició que es verifiqui.

És un bon costum que la darrera condició sigui t (true) per assegurar que al menys una de les condicions es compleix (equivalent a un default).

Escriu la funció darrer, que retorni el darrer element d’una llista (sense emprar el reverse)

(defun darrer (L)
(cond ((null (cdr L)) (car L))
(t (darrer (cdr L)))))
> darrer
(darrer '(a b c d))
> d

Escriu la funció longitud, que retorni la longitud d’una llista

(defun longitud (L)
(cond ((null L) 0)
(t (+ 1 (longitud (cdr L))))))
> longitud
(longitud '(a b c d))
> 4