Vous êtes sur la page 1sur 4

0–

Rappels

LI-101 : Programmation Récursive


◮ Site web de la Licence :

c Équipe enseignante LI101 • http://www-licence.ufr-info-
p6.jussieu.fr/lmd/licence/2010/ue/LI101-2010oct/
Université Pierre et Marie Curie ◮ Ne pas changer de groupe de TD
Semestre d’automne 2010
◮ Lisez régulièrement vos emails prenom.nom@etu.upmc.fr
Cours 3 : Récursion sur les entiers

Christophe Marsala – 2010 LI101 – cours 3 – 2

1 – La conditionnelle 1 – La conditionnelle

Plan du cours Retour sur les alternatives imbriquées


◮ Soit une fonction signe que l’on souhaite écrire
◮ Étant donné un nombre x, cette fonction doit rendre :
La conditionnelle • –1 si x est négatif
• 0 si x est nul
• 1 si x est positif
La récursivité
◮ Deux alternatives imbriquées :

Récursion sur les entiers naturels ;;; signe: Nombre -> int
;;; (signe x) rend –1, 0, ou 1 selon que x est négatif, nul, ou positif
Pour finir (define (signe x)
(if (< x 0)
–1
(if (= x 0)
0
1)))

Christophe Marsala – 2010 LI101 – cours 3 – 3 Christophe Marsala – 2010 LI101 – cours 3 – 4

1 – La conditionnelle 1 – La conditionnelle

La syntaxe d’un cond Évaluation du cond

◮ L’imbrication des alternatives peut devenir illisible et source ◮ Évaluation de condition1


d’erreurs d’écriture • si c’est #t, alors évaluation de e1

Exemple d’utilisation
La conditionnelle simplifie l’écriture de code correspondant à ◮ Sinon, évaluation de condition2
des alternatives imbriquées (cond (condition1 e1)
• si c’est #t, alors évaluation de e2
(condition2 e2)
◮ Grammaire du cond : ◮
... Sinon . . .
<conditionnelle> ::= (cond <clauses>)
(condition2 eN) ◮ Sinon, évaluation de conditionN
<clauses> ::= <clause> <clause>*
(else exprElse)) • si c’est #t, alors évaluation de eN
ou <clause>* (else <expression>)
◮ Sinon évaluation de exprElse
<clause> ::= (<condition> <expression>)

Christophe Marsala – 2010 LI101 – cours 3 – 5 Christophe Marsala – 2010 LI101 – cours 3 – 6
1 – La conditionnelle 2 – La récursivité

Exemple Plan du cours

La conditionnelle
;;; signe: Nombre -> int
;;; (signe x) rend –1, 0, ou 1 selon que x est négatif, nul, ou positif La récursivité
(define (signe x)
(cond ((< x 0) -1) Récursion sur les entiers naturels
((= x 0) 0)
(else 1))) Pour finir

Christophe Marsala – 2010 LI101 – cours 3 – 7 Christophe Marsala – 2010 LI101 – cours 3 – 8

2 – La récursivité 2 – La récursivité

Dessin fractal : le même dessin à différents niveaux Mise en abyme : une image se contient elle-même

Christophe Marsala – 2010 LI101 – cours 3 – 9 Christophe Marsala – 2010 LI101 – cours 3 – 10

2 – La récursivité 2 – La récursivité

Mise en abyme : une image se contient elle-même La récursivité


◮ Mise en abyme
• peinture (dessin, ou photo) qui se contient elle-même (dans un
format plus réduit)
◮ Récursivité
• procédé par lequel un objet se définit à partir d’éléments qui
lui sont identiques
◮ Définition récursive
• définition qui s’énonce à partir d’elle-même (ou d’une variante
d’elle-même)
◮ Un exemple
<expression> ::= <constante>
ou <variable>
ou <application>
<application> ::= (nom-fonc <expression>∗ )

Christophe Marsala – 2010 LI101 – cours 3 – 11 Christophe Marsala – 2010 LI101 – cours 3 – 12
3 – Récursion sur les entiers naturels 3 – Récursion sur les entiers naturels

Plan du cours Définitions récursives


◮ Factorielle
• spécification informelle de la factorielle : n! = 1 ∗ 2 ∗ 3 ∗ . . . ∗ n
La conditionnelle • définition récursive de factorielle n :

Factorielle
La récursivité
1 pour n = 0
n! =
n ∗ (n − 1)! pour n ≥ 1


Récursion sur les entiers naturels


Exemple Scheme de fonction récursive ◮ Puissance
• spécification informelle de la puissance : x n = x ∗ x ∗ . . . ∗ x
• définition récursive de x puissance n :
Pour finir
Puissance
1 pour n = 0
xn =
x ∗ x n−1 pour n ≥ 1


Christophe Marsala – 2010 LI101 – cours 3 – 13 Christophe Marsala – 2010 LI101 – cours 3 – 14

3 – Récursion sur les entiers naturels 3 – Récursion sur les entiers naturels

Principe de définition d’une fonction f récursive Récursion en Scheme


◮ Décomposition : f (n)= . . . f (p) . . .
• expression de f (n) en fonction de f (p) avec p < n
◮ Cas de base : f (0) = . . . ◮ Schéma général de définition d’une fonction f récursive
• valeur(s) de f pour de(s) valeur(s) d’argument(s) de base
(define (f n)
Une autre définition de x puissance n (if condition pour reconnaı̂tre le cas de base
cas de base
pour n = 0
n expression utilisant (f p) avec p < n
n
x = x2 ∗x2 pour n pair ≥ 1

n n
))
 1n

2
x ∗x ∗x2 pour n impair ≥ 1

Évaluation d’une application (exemple : f factorielle)


Les nombres de Fibonacci Fib(n)
(f 3) (* 3 (f 2)) (* 3 (* 2 (f 1))) (* 3 (* 2 (* 1 (f 0))))
(f 0) cas de base : valeur arrêt des appels récursifs
1 pour n = 0 et pour n = 1
Fib(n) =
Fib(n − 1) + Fib(n − 2) pour n ≥ 2


Christophe Marsala – 2010 LI101 – cours 3 – 15 Christophe Marsala – 2010 LI101 – cours 3 – 16

3 – Récursion sur les entiers naturels 3 – Récursion sur les entiers naturels

Définition récursive en Scheme de n! Evaluation d’une application de fonction récursive

◮ Factorielle
C’est une application de fonction comme une autre: règle
;;; fact: nat -> nat
d’évaluation
;;; (fact n) rend la factorielle de n
(define (fact n) Exemple à évaluer
(if (= n 0) (fact 0)
1 (fact 3)
(* n (fact (- n 1))) )) (fact -1)
◮ Repérer le cas de base, l’appel récursif, l’expression pour éviter un processus infini il faut bien faire attention à la
conditionnelle pour reconnaı̂tre le cas de base et le calcul pour condition de reconnaissance du cas de base !
passer à l’étape n.

Christophe Marsala – 2010 LI101 – cours 3 – 17 Christophe Marsala – 2010 LI101 – cours 3 – 18
3 – Récursion sur les entiers naturels 3 – Récursion sur les entiers naturels

Le cas de base mode d’emploi Autre définition de la fonction factorielle


Factorielle (version 2)
Le cas de base est LE point clé de toute fonction récursive
• il permet de terminer le traitement récursif (la “récursion”)
;;; fact: Nombre -> nat
• il garantit qu’il existe au moins une valeur de la fonction f qui
;;; (fact n) rend la factorielle de n
;;; ERREUR si n n’est pas positif ou nul
se calcule sans appel à f
(define (fact n)
◮ Lors de l’écriture d’une fonction récursive, il faut s’assurer : (if (or (not (integer? n)) (negative? n))
• que le cas de base sera atteignable (erreur ”fact: n doit être positif ou nul!”)
• que la séquence d’appels récursifs converge vers la valeur du (if (= n 0)
cas de base 1
◮ Le cas échéant (* n (fact (- n 1)))) ))
• élargir la condition pour le cas de base
• provoquer une erreur si l’argument ne permet pas d’atteindre Évaluer
le cas de base (fact 5), (fact -5), (fact 2.5)
Inconvénient : test supplémentaire fait à chaque appel récursif.

Christophe Marsala – 2010 LI101 – cours 3 – 19 Christophe Marsala – 2010 LI101 – cours 3 – 20

3 – Récursion sur les entiers naturels 4 – Pour finir

Encore une autre définition (sans test supplémentaire) Plan du cours

Factorielle (version 3)
;;; fact: nat -> nat
;;; (fact n) rend la factorielle de n La conditionnelle
(define (fact n)
(if (= n 0)
La récursivité
1
(* n (fact (- n 1)))) ))
Récursion sur les entiers naturels
;;; factorielle: Nombre -> nat
;;; (factorielle n) rend la factorielle de n
Pour finir
;;; ERREUR si n n’est pas positif ou nul
(define (factorielle n)
(if (or (not (integer? n)) (negative? n))
(erreur ”factorielle: n doit être positif ou nul!”)
(fact n)))

Christophe Marsala – 2010 LI101 – cours 3 – 21 Christophe Marsala – 2010 LI101 – cours 3 – 22

4 – Pour finir

Travail avant le prochain TD/TME

◮ Reprendre ses notes le soir-même (mise au propre)


◮ Bien relire le cours en se posant des questions sur ce que vous
comprenez, notez les difficultés
• Retenir le schéma général de définition d’une fonction récursive
• Bien comprendre le rôle du cas de base
◮ Être capable d’écrire, sans l’aide des notes et du cours, la
spécification et la définition des fonctions :
• factorielle
• puissance
◮ Trouver un autre exemple de fonction mathématique
récursive, et donnez son implémentation en Scheme

Christophe Marsala – 2010 LI101 – cours 3 – 23

Vous aimerez peut-être aussi