prise en main de caml light - 4 -...

Post on 22-Jan-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related