Cflp

Laborator

Facultatea de Automatica si Calculatoare 

Departamentul de Calculatoare

 

Home Lucrarea 1 Lucrarea 2 Lucrarea 3 Lucrarea 4 Lucrarea 5 Proiect
  Lucrarea 6 Lucrarea 7 Lucrarea 8 Lucrarea 9 Lucrarea 10  

 

      Lucrarea 3
 

 

 

 

 

 

 

Subiecte

 

 

 

 

   

Īn LISP argumentele unei proceduri sunt transmise prin valoare (ca īn limbajul C). La INTRAREA īn procedură parametrii sunt legaţi la argumente devenind VARIABILE LEGATE, iar la ieşirea din procedură variabilele legate de procedură primesc vechile valori. Variabilele

folosite īntr-o procedură dar care nu sunt parametrii se numesc VARIABILE LIBERE īn raport cu acea procedură şi valoarea lor este determinată lexical.

 

 

Primitiva LET

 

LET leagă variabile şi le dă valori. (SETQ doar dă valori!)

Sintaxă:

(let ((<parametru 1> <valoare initiala 1)

(<parametru 1> <valoare initiala 1)

...

(<parametru n> <valoare initiala n))

<corpul lui let>)

Legarea este valabilă doar īn interiorul corpului lui let.

 

 LET calculează toate valorile iniţiale īnainte de legare  (atribuirea se face "īn paralel", spre deosebire de SETQ care atribuie pe măsură ce evaluează).

 

Exită varianta LET* care leagă variabilele dar atribuie valorile secvenţial (ca procedura SET).

Şi SET are varianta PSET care atribuie valorile īn "paralel".

 

Primitiva FUNCALL

 

FUNCALL permite apelul indirect al fun'ctiilor.

(setq operatie '+)

(funcall operatie 2 3 4)

(setq operatie '*)

(funcall operatie 2 3 4)

 

 

Recursivitate

 

Atunci cānd o procedură se apelează pe sine, direct sau indirect, pentru a rezolva o parte din problemă, avem de a face cu recursivitate.

Calculul lui m^n (n īntreg) se poate face recursiv cu formula:

 

          { m * m^(n-1), pentru n > 0

m^n = {

          { 1, pentru n = 0

 

Programul implementat īn LISP este:

(defun our-expt (m n)

(cond ((zerop n) 1) ; n=0?

(t (* m (our-expt m (- n 1)))))) ; apel recursiv

 

 

Probleme

 

1. Implementaţi recursiv functia factorial.

 

2. Implementaţi recursiv şirul lui Fibonacci.

 

3. Implementaţi recursiv functia member, care testează dacă un element este membru al unei liste.

 

4. Implementaţi fun'ctia (trim-head l n) care elimină din lista l primele n elemente.

 

5. Implementaţi functia (trim-tail l n) care elimină din lista l ultimele n elemente

.

6. Implementaţi (count-atoms l) care numără toţi atomii listei l, inclusiv cei din eventualele liste imbricate.

 

7. Presupuneţi că + şi - pot fi folosite doar pentru a incrementa sau decrementa un număr cu unu (eventual scrieţi procedurile inc şi dec). Scrieţi o procedură recursivă pentru adunarea a două numere īntregi pozitive.

 

8. Implementaţi procedura reverse.

 

9. Implementaţi predicatul presentp care determină dacă un atom apare oriunde īn interiorul unei liste.

 

10. Implementaţi procedura squash care primeşte o expresie simbolică şi returnează lista tuturor atomilor găsiţi.