Scheme Cours5 4p
Scheme Cours5 4p
Scheme Cours5 4p
Programmer
• Soit n ≥ 1 et S(n) = 1 + 2 + .... + n. Prouver que S(n) =
2
2. Une méthode majeure de construction d'objets mathématiques ! 3. Une méthode majeure de raisonnement en programmation !
• Un entier naturel est 0 ou bien le successeur d'un entier naturel. On • Soit n ≥ 1 et S(n) = 1 + 2 + .... + n. Programmer la fonction S.
génère ainsi les entiers sous la forme 0, S(0), S(S(0)), etc.
PROGRAMMATION. Par récurrence sur n ≥ 1. En deux temps :
• La dérivée nème d'une fonction est la dérivée de la dérivée (n-1)ème.
a) si n = 1, c'est évident : S(1) = 1
On calcule ainsi de proche en proche f, f', f'', f(3), etc.
b) montrons que si je sais calculer S(n-1), alors je sais calculer S(n).
• Un quadruplet s'obtient en prenant un couple (u,x) où u est un triplet. Mais ceci découle de la relation de récurrence S(n) = S(n-1) + n
d'où la programmation par récurrence ! CQFP
• Un ensemble à n éléments s'obtient en ajoutant un nouvel élément à
un ensemble à n-1 éléments.
(define (S n) ; n entier ≥ 1 > S(10)
(if (= n 1) 55
etc. Et oui, ce ne sont que des maths ! 1 > S(0)
(+ (S (- n 1)) n))) dans les choux !
Mais comme les maths sont le domaine premier
de la rigueur, ne nous en éloignons que si nous
avons de très très bonnes raisons de le faire ! • Bien entendu il était ici possible de résoudre la récurrence en
faisant des maths, pour obtenir S(n) = n(n+1)/2. Mais ceci est trop
3
difficile dans le cas général en programmation. 4
• Une fonction est récursive si elle est programmée par récurrence. Somme des carrés des entiers de [0,100] n
k2
(define (fac n) ; n entier ≥ 0
(if (= n 0) 0! = 1 • On généralise le problème : somme des carrés k=0
1 n! = n ⇥ (n 1)! si n > 0 des entiers de [0,n] avec n ≥ 0.
(* (fac (- n 1)) n)))
02 + 12 + 22 + · · · + n2 = 02 + 12 + 22 + · · · + (n 1)2 + n2
• Autrement dit, elle s'utilise elle-même dans sa définition !
HR
• Mécanique à deux temps :
- si n=0, je sais calculer n! puisque 0! = 1
(define (somme-carres n) ; n entier ≥ 0
- si n>0, je suppose que je sais calculer (n-1)! et j'en déduis le calcul (if (= n 0)
0
de n! hypothèse de (+ (somme-carres (- n 1)) (sqr n))))
récurrence HR
• Il est vital de prévoir un cas de base [souvent n=0] sur lequel le cas
> (somme-carres 100)
général doit finir par converger. Erreur typique : 338350
• Dans la fonction somme-carrés, le cas de base n = 0 n'est pas fameux La fonction puissance (expt x n) avec n entier ≥ 0 VERSION 1
car il restreint le domaine de définition de la fonction à N. En fait, il ne
• La fonction primitive (expt a b) calcule ab.
respecte pas la spécification mathématique de la fonction :
n • Comment programmerions-nous (expt x n) avec n entier ≥ 0 si elle
S(n) = k =
2
k 2
n'existait pas ? Nommons-la $expt pour ne pas tuer la primitive !
k=0 0 k n
x0 = 1
• Or pour n < 0, l'inéquation 0 ≤ k ≤ n n'a aucune solution, donc :
xn = x xn 1
si n > 0
S(n) = k =0
2
si n < 0
k ⇥ (define ($expt x n) ; x complexe, n entier ≥ 0
(if (= n 0)
1
(define (somme-carres n) ; n entier quelconque
(* x ($expt x (- n 1)))))
(if (<= n 0)
0
(+ (somme-carres (- n 1)) (sqr n))))
> ($expt 2 10)
1024
• ATTENTION : le nombre d'opérations n'est pas nécessairement • Les grandes CLASSES DE COMPLEXITE [ coût] d'algorithmes :
proportionnel au temps de calcul ! En effet, multiplier des nombres à 3 - Les algorithmes de coût constant O(1). Leur complexité ne dépend pas de
chiffres ou à 300 chiffres ?... Exemple avec la factorielle : la taille n des données.
> (time (* 0 (fac 5000))) - Les algorithmes de coût logarithmique O(log n). Leur complexité est dans
cpu time: 154 real time: 155 gc time: 111
N = 5000 Temps = 43 le pire des cas de l'ordre de log(n).
0
> (time (* 0 (fac 10000))) - Les algorithmes de coût linéaire O(n). Leur complexité est dans le pire
N = 10000 Temps = 173
cpu time: 528 real time: 532 gc time: 355 des cas de l'ordre de n.
0
- Les algorithmes de coût quasi-linéaire O(n log n). Presqu'aussi bons que
• La complexité du calcul de (fac n) si l'on mesure le nombre de les algorithmes linéaires...
multiplications, est linéaire : d'ordre n. - Les algorithmes de coût quadratique O(n2). Pas fameux...
• La complexité du calcul de (fac n) si l'on mesure le temps de calcul - Les algorithmes de coût exponentiel O(2n). Catastrophique !!
n'est pas linéaire. Sinon, le temps de calcul pour N = 10000 aurait été
O(1) O(log n) O(n) O(n log n) O(n2) O(2n)
le double de celui pour N = 5000. Or c'est 4 fois plus !
n T=10 ms T=10 ms T=10 ms T=10 ms T=10 ms T=10 ms
Cela semble indiquer un comportement peut-être
quadratique en temps de calcul : en O(n2) ? PCPS exo 6.8.12 2n T=10 ms T+ε=10.5 ms 2T=20 ms 2T+ε=22 ms 4T=40 ms T2=100 ms
11 12
Résolution du problème combinatoire nb-régions Peut-on résoudre une récurrence ?
• Etant données n droites du plan en position générale, calculer le •Etant donnée une formule de récurrence, peut-on éliminer la
nombre Rn de régions (bornées ou pas). récurrence ? Trouver une formule directe pour le terme général ?
5
a) Si n = 0, il est clair que R0 = 1 6 REPONSE : C'est difficile voire impossible en général ! On le peut dans
b) Supposons connu Rn 1 et introduisons une 1
7
certains cas très simples, par exemple pour nb-regions.
4
nème droite dans une configuration de n-1 droites. 2
On déroule la récurrence :
La nème droite va rajouter une région pour chaque 3 R0 = 1
R n = Rn 1 +n
droite de la configuration, plus une dernière pour R n = Rn R n = Rn +n
2 + (n 1) + n 1
la région non bornée, ok ?
R n = Rn 3 + (n 2) + (n 1) + n
Rn = Rn 1 + (n 1) + 1 = Rn 1+n ···
R n = R0 + 1 + 2 + · · · + n
(define (nb-regions-direct n)
En résumé : (define (nb-regions n) > (nb-regions 3) Rn = 1 + (1 + 2 + · · · + n) (quotient (+ (* n (+ n 1)) 2) 2))
(if (= n 0) 7 n(n + 1)
1
Rn = 1 + Complexité : O(1) opérations !
> (nb-regions 10) 2
(+ (nb-regions (- n 1)) n))) 56 n2 + n + 2
Rn =
2 formule que l'on peut ensuite... prouver par récurrence !
• La complexité est O(n) en le nombre d'opérations. 13 14
Calcul approché d'une intégrale Une récurrence double : la suite de Fibonacci 0, 1, 1, 2, 3, 5, 8, 13...
cf
> (partitions 5 5) > (partitions 15 15)
T
D
7 176
(define (nb-chemins N) ; le carré comme cas particulier
!
> (partitions 8 3) > (partitions 20 20)
(nb-chemins-rect N N)) 10 627
N.B. = ⊕
carré underlay
•Ceci est particulièrement vital si HR est utilisé plusieurs fois dans la
relation de récurrence (on ne calcule JAMAIS plusieurs fois HR !)...
Solution pour n Hypothèse de p
récurrence sur n-1 21
un = un 1 + un 1 Calcul naïf en O(2n) 22