Scheme - TD supplémentaire
Représentation des ensembles
(define (adjoindre x l)
(define (aux l res)
(cond ((null? l) (cons x res))
((equal? x (car l)) (append res l))
(else (aux (cdr l) (cons (car l) res)))))
(aux l '()))
(define (adjoindre2 x l)
(define (aux laux)
(cond ((null? laux) (cons x l))
((equal? x (car laux)) l)
(else (aux (cdr laux)))))
(aux l))
(define (adjoindre3 x l) (if (member x l) l (cons x l)))
(define (union l1 l2)
(cond ((null? l1) l2)
((member (car l1) l2) (union (cdr l1) l2))
(else (union (cdr l1) (cons (car l1) l2)))))
(define (union2 l1 l2)
(cond ((null? l1) l2)
(else (union2 (cdr l1) (adjoindre (car l1) l2)))))
(define (inter l1 l2)
(define (aux l1 res)
(cond ((null? l1) res)
((member (car l1) l2)
(aux (cdr l1) (cons (car l1) res)))
(else (aux (cdr l1) res))))
(aux l1 '()))
Représentation par des listes ordonnées.
(define (union-bis l1 l2)
(define (aux l1 l2 res)
(cond ((null? l1) (append (reverse res) l2))
((null? l2) (append (reverse res) l1))
((< (car l1) (car l2))
(aux (cdr l1) l2 (cons (car l1) res)))
((= (car l1) (car l2))
(aux (cdr l1) (cdr l2) (cons (car l1) res)))
(else (aux l2 l1 res))))
(aux l1 l2 '()))
(define (inter-bis l1 l2)
(define (aux l1 l2 res)
(cond ((or (null? l1) (null? l2)) (reverse res))
((< (car l1) (car l2)) (aux (cdr l1) l2 res))
((= (car l1) (car l2))
(aux (cdr l1) (cdr l2) (cons (car l1) res)))
(else (aux l2 l1 res))))
(aux l1 l2 '()))
> (* 2 (zero cos 0 3 0.001)) 3.141357421875 > (* 2 (zero cos 0 3 0.000001)) 3.14159274101257 > (zero (lambda (x) (- 1 x)) 0 2 0.0001) 1Traçage d'une courbe entre des points a et b:
(define (f1 x) (* 30 (cos x))) (define (f2 x) (+ (- (* 2 x x x)) (* 12 x x) (- (* 18 x)) 20)) (define (f3 x) (- (* 10 (log x))))> (trace-courbe f1 0 3.14) * * * * * * * * * * * * * * * * * * * * * > (trace-courbe f2 0 5) * * * * * * * * * * * * * * * * * * * * *
(define (parcours a b laby w)
(define (aux file old)
(cond ((null? file) 'bloque)
((equal? (car file) b) 'gagne)
(else (deplacer (car file) w)
(aux (ajouter (successeurs (car file) laby)
(cdr file)
old)
(cons (car file) old)))))
(aux (list a) ()))
--- b3 ---
D1 D2
E
file:Que faut-il changer dans la gestion de la file pour effectuer des marches arrières lorsqu'on parvient à un cul-de-sac? Faire une fonction (cul-de-sac? pos entree laby) qui détermine si pos est un cul-de-sac dans le labyrinthe laby dont le point d'entrée est entree. En déduire la nouvelle fonction parcours.
(B3)
(D1 D2 B3) on garde B3
(E D1 D2 B3) on garde D1
(D1 D2 B3) E = cul-de-sac --> marche arrière
(D2 B3) autre direction
(define (cul-de-sac? pos entree laby)
(and (= (length (successeurs pos laby)) 1)
(not (equal? pos entree))))
(define (parcours a b laby w)
(define (aux file old)
(cond ((null? file) 'bloque)
((equal? (car file) b) 'gagne)
((cul-de-sac? (car file) a laby)
(deplacer (car file) w)
(aux (cdr file) (cons (car file) old)))
((member (car file) old)
(deplacer (car file) w)
(aux (cdr file) old))
(else (deplacer (car file) w)
(aux (ajouter (successeurs (car file) laby)
file
old)
(cons (car file) old)))))
(aux (list a) '()))