Prise en main de CaML Light - 4 -...
Transcript of Prise en main de CaML Light - 4 -...
Prise en main de CaML Light - 4
Lycée Thiers 2015
Prise en main de CaML Light - 4
Récursivité
Prise en main de CaML Light - 4
Récursivité
Prise en main de CaML Light - 4
Récursivité
Prise en main de CaML Light - 4
Dans la nature aussi !
Prise en main de CaML Light - 4
Un modèle simplifié de végétal
Prise en main de CaML Light - 4
Un modèle simplifié de végétal
Prise en main de CaML Light - 4
Un modèle simplifié de végétal
Prise en main de CaML Light - 4
Un modèle simplifié de végétal
Prise en main de CaML Light - 4
Un modèle simplifié de végétal
Prise en main de CaML Light - 4
Structures récursives
mot :
mot videmot ^ lettre
liste :
liste vide [ ]élément : : liste
arbre binaire :
arbre vide
arbre arbre
objet
Prise en main de CaML Light - 4
Fonctions récursives
Factorielle (définition itérative) :
n! =n∏
k=1
k
Factorielle (définition récursive) :
0! = 1n! = n (n − 1)!
Fonction définie à partir d’elle-même ! ?
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = (0)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = (0)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = (0)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× 4!(0)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× 3!)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× 2!))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× (2× 1!)))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× (2× (1× 0!))))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× (2× (1× 1))))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× (2× 1)))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× (3× 2))
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× (4× 6)
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 5× 24
Prise en main de CaML Light - 4
Calcul récursif de n !
let rec fact n =if n = 0 then 1else n * (fact (n-1))
;;
Exemple : n = 5
5! = 120
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Empilement / dépilement
acheter du pain
Prise en main de CaML Light - 4
Empilement / dépilement
cadeau d’anniversaire
Prise en main de CaML Light - 4
Empilement / dépilement
retirer des sous
Prise en main de CaML Light - 4
Empilement / dépilement
prendre la voiture
Prise en main de CaML Light - 4
Empilement / dépilement
aller chercher les clefs
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Empilement / dépilement
Prise en main de CaML Light - 4
Récursion dans le langage
Sie gehen ins Kino, weil sie einen film sehen wollen.
Trop de niveaux refoulés→ phrase incompréhensible !
Le phénomène allemand bien connu du rejet du verbeà la fin, sur lequel des histoires drôles de professeursqui commencent une phrase, sautent d’un sujet à unautre pendant tout le cours, et finissent par débiterune série de verbes auxquels le public, pour qui lapile a depuis longtemps perdu toute cohérence, necomprend plus rien, circulent dans tous les couloirsd’université, est un excellent exemple.
Gödel, Escher, Bach : les brins d’une guirlande éternelle[an eternal golden braid]Douglas Hofstadter
Prise en main de CaML Light - 4
Une pile d’assiettes ...
sommet
dépilerempiler
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35(35
)5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35(35
)5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 =(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× 34(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3×(3× 33
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3×(3×
(3× 32
))
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3×(3×
(3×
(3× 31
)))
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× (3× (3× (3× (3× 1))))(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× (3× (3× (3× 3)))(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× (3× (3× 9))(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× (3× 27)(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 3× 81(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 243(35
)
5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion
let rec puissance x n =if n = 0 then 1else x * (puissance x (n-1))
;;
Exemple : x = 3, n = 5
35 = 243(35
)5 multiplications + gestion de la pile
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 =
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 1 5
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 3 4
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 9 3
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 27 2
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 81 1
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = aux 243 0
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = 243
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Calcul de xn : récursion terminale
let puissance x n =aux 1 n whererec aux pp n =if n = 0 then ppelse aux (x * pp) (n-1)
;;
Exemple : x = 3, n = 5
35 = 243
5 multiplications + “récursion sans pile”
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2
x13 = x(x6
)2
x6 =(x3
)2
x3 = x x2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Prise en main de CaML Light - 4
Exponentiation rapide - Exemple : x27
x27 = x(x13
)2→2
x13 = x(x6
)2→2
x6 =(x3
)2→1
x3 = x x2→2
Coût total = 7 multiplications
Prise en main de CaML Light - 4
Calcul de xn : exponentiation rapide
∀n ∈N?, xn =
(xn/2
)2si n pair
x(x(n−1)/2
)2sinon
T (1) = 0 T (n) = T(⌊n
2
⌋)+ 1 + (n mod 2)
T (n) =⌊log2 (n)
⌋+ σn − 1
log2 (n) 6 T (n) 6 2 log2 (n)
Prise en main de CaML Light - 4
Exponentiation rapide
Retour à l’exemple :
x27 calculé avec 7 multiplications ...
T (27) =⌊log2 (27)
⌋+ σ27 − 1
16 = 24 < 27 < 25 = 32⇒⌊log2 (27)
⌋= 4
27 = 110112 ⇒ σ27 = 4
T (27) = 7
Prise en main de CaML Light - 4
Calcul de xn : on récapitule ...
1 version itérative
2 version récursive
3 version récursive terminale
4 exponentiation rapide
Prise en main de CaML Light - 4
Remplissage d’un damier 2n× 2n
Prise en main de CaML Light - 4
Remplissage d’un damier 2n× 2n
Prise en main de CaML Light - 4
Remplissage d’un damier 2n× 2n
Peut-on recouvrir le damier entier ?
C’est impossible, car ...
4n . 0 [3]
Et si on enlève une case ?
4n− 1 ≡ 0 [3]
ça peut marcher ... mais ce n’est pas garanti a priori !
D’ailleurs, voici un exemple classique ... (page suivante)
Prise en main de CaML Light - 4
Damier (2n) × (2n) et dominos
Prise en main de CaML Light - 4
Damier (2n) × (2n) et dominos
Prise en main de CaML Light - 4
Damier (2n) × (2n) et dominos
Prise en main de CaML Light - 4
Damier (2n) × (2n) et dominos
Prise en main de CaML Light - 4
Damier (2n) × (2n) et dominos
Etant donné un damier de format (2n) × (2n) duquel on aretiré deux cases diagonalement opposées, il estimpossible de recouvrir ce qui reste à l’aide de dominos(chaque domino pouvant recouvrir deux cases,horizontalement ou bien verticalement).
En effet, chaque domino recouvre une case blanche etune case noire, or les deux cases supprimées étaient dela même couleur !
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case (reprise)
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case (reprise)
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case (reprise)
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case (reprise)
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case
Solution récursive pour le problème à l’ordre n :
Si n = 1, c’est évident !Si n > 2 :
on partage en 4 damiers 2n−1× 2n−1
on place un ’L’ au centre avec la bonne orientationon résout 4 problèmes à l’ordre n − 1
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case
Prise en main de CaML Light - 4
Damier 2n× 2n privé d’une case
Prise en main de CaML Light - 4