Scheme - TD n° 9
14 mai 2003
Récursion terminale, représentation des nombres en chiffres romains
(define (iota n)
(define (aux k res)
(cond ((> k n) res)
(else (aux (+ k 1) (cons k res)))))
(aux 1 '()))
Faire en version terminale la fonction (maximum l) qui calcule le maximum d'une liste de nombres.
(define (maximum l)
(define (aux l var)
(cond ((null? l) var)
(else (aux l (max (car l) var)))))
(aux (cdr l) (car l)))
Faire en version terminale la fonction (our-reverse l) qui inverse une liste.
(define (our-reverse l)
(define (aux l res)
(cond ((null? l) res)
(else (aux (cdr l) (cons (car l) res)))))
(aux l '()))
Faire en version terminale la fonction (enleve x l) qui enlève toutes les occurrences de x dans l.
(define (enleve x l)
(define (aux l res)
(cond ((null? l) (reverse res))
(else (aux (cdr l)
(if (equal? (car l) x)
res
(cons x res))))))
(aux l '()))
(define (enleve x l)
(define (aux l res)
(cond ((null? l) res)
(else (aux (cdr l)
(if (equal? (car l) x)
res
(append res (list x)))))))
(aux l '()))
Faire en version terminale la fonction (somexp x n) calculant l'expression suivante, sans variable auxiliaire et sans sous-programme (Juin 1992) :
1 + 1 + 1 + 1 + ... + x
1! 2!  3! n!
(define (compter l)
(define (aux n l1 l2)
(cond ((and (null? l1) (null? l2)) n)
((null? l1) (aux n (car l2) (cdr l2)))
((pair? l1) (aux n (car l1) (cons (cdr l1) l2)))
(else (aux (+ n 1) (car l2) (cdr l2)))))
(if (null? l) 0 (aux 0 (car l) (cdr l))))
Faire en version terminale la fonction (compter l) qui compte les atomes non vides de la liste l à tous les niveaux : (compter '((a) ((b c) ()))) -> 3
(define (compter l)
(define (aux n l1 l2)
(cond ((and (null? l1) (null? l2)) n)
((null? l1) (aux n (car l2) (cdr l2)))
((pair? l1) (aux n (car l1) (cons (cdr l1) l2)))
(else (aux (+ n 1) (car l2) (cdr l2)))))
(if (null? l) 0 (aux 0 (car l) (cdr l))))
> (romain->decimal '(m x l v i i)) 1047
Faire la fonction réciproque (dec->rom n) qui transforme un nombre en liste de chiffres romains. On s'aidera du tableau ci-après (disponible dans Excel en insérant une fonction "Math&Trigo" appelée "Romain", en mettant le nombre en 1er arg. et rien en 2ème pour le "type").
| 1 | I | 11 | XI | 10 | X | 110 | CX | 210 | CCX | 100 | C | 1100 | MC | 1000 | M |
| 2 | II | 12 | XII | 20 | XX | 120 | CXX | 220 | CCXX | 200 | CC | 1200 | MCC | 2000 | MM |
| 3 | III | 13 | XIII | 30 | XXX | 130 | CXXX | 230 | CCXXX | 300 | CCC | 1300 | MCCC | 3000 | MMM |
| 4 | IV | 14 | XIV | 40 | XL | 140 | CXL | 240 | CCXL | 400 | CD | 1400 | MCD | 3100 | MMMC |
| 5 | V | 15 | XV | 50 | L | 150 | CL | 250 | CCL | 500 | D | 1500 | MD | 3200 | MMMCC |
| 6 | VI | 16 | XVI | 60 | LX | 160 | CLX | 260 | CCLX | 600 | DC | 1600 | MDC | 3300 | MMMCCC |
| 7 | VII | 17 | XVII | 70 | LXX | 170 | CLXX | 270 | CCLXX | 700 | DCC | 1700 | MDCC | 3400 | MMMCD |
| 8 | VIII | 18 | XVIII | 80 | LXXX | 180 | CLXXX | 280 | CCLXXX | 800 | DCCC | 1800 | MDCCC | 3500 | MMMD |
| 9 | IX | 19 | XIX | 90 | XC | 190 | CXC | 290 | CCXC | 900 | CM | 1900 | MCM | 3600 | MMMDC |
| 10 | X | 100 | C | 200 | CC | 300 | CCC | 1000 | M | 3700 | MMMDCC | ||||
| 3800 | MMMDCCC | ||||||||||||||
| 3900 | MMMCM | ||||||||||||||
| 3999 | MMMCMXCIX | ||||||||||||||
| 4000 | #VALEUR! |