Jean-Jacques BOURDIN
Premier semestre 2011-2012
Quand tout fonctionne bien, envoyez votre travail par mail: Utilisez, s'il vous plait, votre adresse mail donnée par l'université. Sinon, parfois, ma réponse ne peut pas vous parvenir.
Mon adresse : jj
à : ai.univ-paris8.fr
(fct par81 par82 ... par_n)
(define (carre n)
(* n n))
(define (negatif n)
(if (< n 0)
#t
#f))
Est récursif tout ce qui est récursif
(define (s n)
(if (= n 0)
0
(+ (s (- n 1)) n)))
| f(0)=1 |
| f(1)=1 |
| f(n)= f(n-1) + f(n-2) |
(define (pcr n)
(if (< n 2)
1
(+ (pcr (- n 1))
(pcr (- n 2)))))
|
(define (s n)
(s2 n 0))
(define (s2 n a)
(if (= n 0)
a
(s2 (- n 1) (+ n a))))
|
(define (f n)
(f2 n 1))
(define (f2 n a)
(if (< n 2)
a
(f2 (- n 1) (* n a))))
|
>(cons 3 (cons 2 ())) = (3 2)
(car (cdr (cons 4 (cons 3 (cons 2 ()))))) 3Mais quand on a un objet, comment savoir si c'est une liste ? Si c'est une liste non vide, c'est une "paire".
> (pair? 2) #f > (pair? '(5 6)) #t > (pair? '()) #f >Les cinq fonctions indispensables sont donc :
(define (plgd l) (if (pair? l) (plgrd (car l) (cdr l)) 0)) (define (plgrd cand l) (if (pair? l) (if (< cand (car l)) (plgrd (car l) (cdr l)) (plgrd cand (cdr l))) cand)) ;> (plgd ll) ;13 |
(define (seco l) (if (pair? l) (if (pair? (cdr l)) (second (min (car l) (cadr l)) (max (car l) (cadr l)) (cddr l)) -1) -1)) (define (second un deux l) (if (pair? l) (if (< un (car l)) (second (car l) un (cdr l)) (if (< deux (car l)) (second un (car l) (cdr l)) (second un deux (cdr l)))) deux)) ;> (seco ll) ;12 |
> (enlever 5 '(8 9 2 3 5 6 1 7)) '(8 9 2 3 6 1 7)
> (etlo 5 '(8 9 2 5 3 5 6 1 5 7)) '(8 9 2 3 6 1 7)
> (etloslp 5 '(8 9 2 5 3 5 6 1 5 7)) '(8 9 2 5 3 6 1 7))
Qui fabrique une liste de toutes les valeurs présentes au moins une fois dans la liste (i.e. sans répétition).
(define (conca l1 l2) (if (pair? l1) (cons (car l1) (conca (cdr l1) l2)) l2)) ;> ll ;'(8 1 2 8 1 9 2 10 3 4 7 5 6 12 13 -1 7) ;> (conca ll ll) ;'(8 1 2 8 1 9 2 10 3 4 7 5 6 12 13 -1 7 8 1 2 8 1 9 2 10 3 4 7 5 6 12 13 -1 7) |
(de (reve l)
(if (not (pair? l)) l
(if (not (pair? (cdr l))) l
(cons (car (reve (cdr l)))
(reve (cons (car l) (reve (cdr (reve (cdr l))))))))))
|
(define (inver l) (if (pair? l) (conca (inver (cdr l)) (list (car l))) '())) ;> ll ;'(8 1 2 8 1 9 2 10 3 4 7 5 6 12 13 -1 7) ;> (inver ll) ;'(7 -1 13 12 6 5 7 4 3 10 2 9 1 8 2 1 8) |
C'est ce qu'on appelle le tri par insertion.
(define (ins a lt) (if (pair? lt) (if (< a (car lt)) (cons a lt) (cons (car lt) (ins a (cdr lt)))) (list a))) |
(define (liste? (l)
(if (unpair l) #f
(if (equal? l '()) #t
(liste? (cdr l)))))
|
(define (cher x l) (if (unpair l) #f (if (pair? (car l)) (if (cher x (car l)) #t (cher x (cdr l))) (if (equal? x (car l)) #t (cher x (cdr l)))))) |
Ensuite vous pouvez regarder la somme des éléments numériques d'une liste.
(define (unpair l) (not (pair? l))) (define (somlc l) (if (unpair l) 0 (if (pair? (car l)) (+ (somlc (car l)) (somlc (cdr l))) (if (equal? (car l) '()) (somlc (cdr l)) (+ (car l) (somlc (cdr l))))))) |
(cadar (cddr '(1 (2) (3 4 5 () 6)))) (caddr (cddr '(1 (2) (3) (4 5 () 6)))) (cddr '(1 (2) (3) (4 5 () 6))) (caddr (cddr '(1 (2) (3) (4 5 () 6)))) (caaar '((1 (2) (3 4 5 () 6) (a b c) (d)))) (cadar (cddar '((1 (2) (3 4 5 () 6)) (a b c)))) (caddr (cddar '((1 (2) (3 4 5 () 6)) (a b c)))) (caddr (cddar '((1 (2) (3 4 5 () 6)) (a b c) (d)))) (caddr (cddar '((1 (2) (3 4 5 () 6) (a b c) (d))))) (cddar '((1 (2) (3 4 5 () 6) (a b c) (d)))) |
Quelques exemples :
'() '(8 (5 () ()) (9 () (11 () ())))sont des listes rangées Chercher un élément dans une telle liste est rapide, il suffit de savoir où chercher.
(define (yest x lr) (if (unpair lr) #f (if (= x (car lr)) #t (if (< x (car lr)) (yest x (cadr lr)) (yest x (caddr lr)))))) |
(define (unpair l) (if (pair? l) #f #t)) (define (petits a l) (if (unpair l) '() (if (< a (car l)) (petits a (cdr l)) (cons (car l) (petits a (cdr l)))))) (define (grands a l) (if (unpair l) '() (if (> a (car l)) (grands a (cdr l)) (cons (car l) (grands a (cdr l)))))) (define (range4 l) (if (< (car l) (cadr l)) `(,(car l) () (,(cadr l) () ())) `(,(car l) (,(cadr l) () ()) ()))) (define (qsl l) (if (unpair l) l (if (unpair (cdr l)) `(,(car l) () ()) (if (unpair (cddr l)) (range4 l) `( ,(car l) ,(qsl (petits (car l) (cdr l))) ,(qsl (grands (car l) (cdr l)))))))) |
(define (separe pivot l) (separ pivot l '() '())) (define (separ pivot l ptl gdl) (if (unpair l) `(,ptl ,gdl) (if (< (car l) pivot) (separ pivot (cdr l) (cons (car l) ptl) gdl) (separ pivot (cdr l) ptl (cons (car l) gdl))))) (define (tsl l) (if (unpair l) l (if (unpair (cdr l)) `(,(car l) () ()) (if (unpair (cddr l)) (range4 l) (let* ((sep (separe (car l) (cdr l))) (pts (tsl (car sep))) (gds (tsl (cadr sep)))) `(,(car l) ,pts ,gds)))))) |
(define (okgd pivot lr) (if (unpair lr) #t (if (< pivot (car lr)) #f (if (okgd pivot (cadr lr)) (okgd pivot (caddr lr)) #f)))) (define (okpt pivot lr) (if (unpair lr) #t (if (> pivot (car lr)) #f (if (okpt pivot (cadr lr)) (okpt pivot (caddr lr)) #f)))) (define (estlr lr) (if (unpair lr) (if (equal? lr '()) #t #f) (if (okgd (car lr) (cadr lr)) (if (okpt (car lr) (caddr lr)) (if (estlr (cadr lr)) (estlr (caddr lr)) #f) #f) #f))) |
Les listes d'association sont des listes de couples (a . b) où a est
un "identifiant" et b est la valeur associée. Par exemple:
((couleur . rouge) (taille . grande) (forme . cube))
On peut utiliser la fonction assoc qui permet, pour un
certain identifiant de déterminer la valeur associée. Prenons ici
l'exemple d'une liste al qui donne pour tous les identifiants
la valeur de leur carré:
;? al ;=((0 . 0) (1 . 1) (2 . 4) (3 . 9) (4 . 16) (5 . 25) (6 . 36)) ;? (assoc 4 al) ;= (4 . 16) ;? (car (assoc 4 al)) ;= 4 ;? (cdr (assoc 4 al)) ;= 16 |
Un exemple d'utilisation du "cond".
(define (lecond n)
(cond ((= n 0) 1)
((= n 1) 1)
(* (+ (lecond (- n 1)) (lecond (- n 2))))))
|
Dernière mise à jour de ce document :