Scheme - TD n° 11
28 mai 2003
Itérateurs
Révisions
(define (somme f n)
(cond ((= n 0) 0)
(else (+ (f n) (somme f (- n 1))))))
Faire une fonction (itere f n x) qui calcule:
(define (itere f n x)
(cond ((= n 0) x)
(else (+ x (itere f (- n 1) (f x))))))
(define (itere-term f n x)
(define (aux n x res)
(cond ((= n 0) res)
(else (aux (- n 1) (f x) (+ x res)))))
(aux n (f x) x))
Faire une fonction (genere f n x) qui calcule la liste:
(define (genere f n x)
(cond ((= n 0) (list x))
(else (cons x (genere f (- n 1) (f x))))))
(define (genere1 f n x)
(cond ((= n 0) (list x))
(else (cons x (map f (genere1 f (- n 1) x))))))
Evaluer (Septembre 2002) :
a- (car '(1 2 3 4)) b- (car (cdr (cdr '(1 2 3 4)))) c- (car (cdr (reverse '(1 2 3 4)))) d- (car (list (car '(1 2 3 4))))Evaluer (Septembre 2002) :
a- (map list '(1 2 3 4)) b- (map car (map list '(1 2 3 4))) c- (car (car (map list '(1 2 3 4)))) d- (map cdr (list '(1 2) '(3 4)))Faire en version terminale la fonction (conway-term u0 n) calculant la suite de Conway définie par u0 quelconque, un = un-1/2 si un-1 est pair, et un = 3*un-1 + 1 sinon. Peut-on faire cette version terminale sans utiliser une fonction auxiliaire ? (Juin 2002)
2ème méthode (non terminale, mais plus rapide): On sépare la liste en deux sous-listes, celle des éléments plus petits que le premier élément, et celle des éléments plus grands. Puis on trie de la même manière les deux sous-listes. Et on recolle les listes triées obtenues, en insérant l'élément entre les deux.