Scheme - TD n° 5
26 mars 2003
Récursions numériques
(define (somme-carre n)
(cond ((= n 0) 0)
(else (+ (* n n) (somme-carre (- n 1))))))
Faire une fonction (carre-somme n) qui calcule le carré de la somme des n premiers entiers: (1 + 2 + 3 ... + n)2
(define (carre-somme n) (let ((s (somme n))) (* s s)))
(define (somme n) (if (= n 0) 0 (+ n (somme (- n 1)))))
(define (carre-somme n)
(cond ((= n 0) 0)
(else (let ((s (carre-somme (- n 1))))
(+ (* n n) (* 2 n (sqrt s)) s)))))
On considère la suite définie par un = (un-1)2 - un-1 pour tout entier n > 0, et par u0 = 2.001. Faire une fonction (u n) calculant un. On demande une version optimisée (Partiel 1996).
(define (u n)
(cond ((= n 0) 2.001)
(else (let ((x (u (- n 1)))) (- (* x x) x)))))
On considère la suite définie par un = 10n! pour tout entier n > 0. Après avoir exprimé un en fonction de un-1 à l'aide de la fonction expt, faire une fonction (u n) calculant un. On rappelle que (expt x y) calcule xy (Partiel 1995).
(define (u n)
(cond ((= n 1) 10)
(else (expt (u (- n 1)) n))))
Faire une fonction qui inverse les chiffres d'un entier naturel. Exemple : (inv 4256) -> 6524 (Partiel 1991). On utilisera les fonctions quotient et remainder. Indication : on déplace un chiffre entre deux entiers u et v (ainsi u=324, v=12 donnent u'=32, v'=124). Quelle est l'expression Scheme de u' et v' en fonction de u et v? Faire une boucle qui itere la transformation jusqu'à u=0.
(define (inv n) (aux n 0))
(define (aux u v)
(cond ((= n 0) v)
(else (aux (quotient u 10) (+ (* 10 v) (remainder u 10))))))
Exemple : voila une fonction qui affiche tous les nombres contenus dans un fichier
(define (lecture nom-fichier)
(let ((n (open-input-file nom-fichier)))
(boucle n)))
(define (boucle n)
(let ((x (read-char n)))
(cond ((eof-object? x) 'stop)
(else (display x) (display " ") (boucle n)))))
Écrire quelques nombres dans une fenêtre DrScheme, sauver la fenêtre dans un fichier, puis essayer la fonction (lecture nom-fichier).