• Aucun résultat trouvé

Suites - Récursivité - Complexité

N/A
N/A
Protected

Academic year: 2022

Partager "Suites - Récursivité - Complexité"

Copied!
29
0
0

Texte intégral

(1)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 1/29

Mathématiques appliquées à l’informatique Suites – Récursivité - Complexité

Bertrand LIAUDET

SOMMAIRE

SOMMAIRE 1

SUITES – RECURSIVITE - COMPLEXITE 3

Références 3

Objectifs 3

Tableau d’amortissement d’un prêt : utilisation de tableur 3

Algorithme récursif 3

Complexité 3

Définitions 4

Suite, terme, terme général 4

Suite explicite 4

Suite récursive 5

Calculette, tableur, programmation 5

Exercices 6

Suites arithmétiques et suites géométriques 8

Suite arithmétique : progression par une addition 8

Suite géométrique : progression par une multiplication 10

Variations d’une suite et limite d’une suite 12

Suite croissante, décroissante, monotone 12

Limites 12

Propriétés des suites arithmétiques 12

Propriétés des suites arithmétiques 12

Notion de conjecture 13

Exercices sur les suites avec excel 14

Série 1 14

Série 2 14

TP 1 : taux d’intérêt 15

TP 2 : 7 milliards d’êtres humains, et moi et moi et moi ! 15

TP 3 : tableau d’amortissement d’un prêt 15

Algorithmique des suites – Algorithme itératif – Algorithme récursif 17 Exemple : la suite des sommes des n premiers nombres entiers 17

(2)

Algorithmes correspondants 18

Exercices 20

Complexité des algorithmes 24

Présentation 24

Exercice 1 26

Tri à bulles 28

Recherche dichotomique 29

Tours de Hanoï 29

Dernière édition : février 2018

(3)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 3/29

SUITES – RECURSIVITE - COMPLEXITE

Références

Mathématique pour l’informatique – BTS SIO – Dunod – 2015 : Chapitre 2, pp. 35-59.

Méthodes mathématiques pour l’informatique – IUT-Licence-Ecole d’ingénieurs-CNAM – Dunond 2013.

Objectifs

Tableau d’amortissement d’un prêt : utilisation de tableur

On emprunte 300 000 euros à 2% d’intérêt par an. Le remboursement se fait sur 15 ans.

De combien sera le remboursement mensuel ?

Inversement : On peut rembourser 1000 euros par mois. Combien pourra-t-on emprunter sur 15 ans à 2% d’intérêt ?

Algorithme récursif

Comment écrire un algorithme récursif à partir d’une suite ?

Complexité

Quelle est la complexité d’un algorithme de tri à bulles non optimisé ? Quelle est la complexité de la version optimisée ?

Quelle est la complexité d’une recherche dichotomique ?

(4)

Définitions

Suite, terme, terme général Suite

• Une suite numérique est une liste de nombres ordonnés marqués en général par un indice.

(u0 ; u1 ; u2 ; u3 ; …) ou (u1 ; u2 ; u3 ;…) sont des suites numériques.

• On la note (un) : entre parenthèses, u avec un indice.

• En général, on parle de « suite » à la place de « suite numérique » Terme

• Chaque élément de la liste s’appelle « terme ».

• On les note : u0, u1, un-1, un, un+1, etc.

• Les termes peuvent aller de 0 à l’infini.

Terme général

• Si un = f(n) autrement dit si un s’écrit sous la forme d’une fonction de n, alors un est le « terme général » de la suite.

Exemple

(1 ; 3 ; 5 ; 7 ; …) est la suite numérique des nombres impairs positifs.

Pour tout n >=0, un = 2*n-1, en démarrant avec n=1

Suite explicite Suite explicite

Une suite définie par son terme général est appelée « suite explicite ».

On dit aussi qu’elle est définie explicitement.

On appelle SE l’ensemble des suites explicites.

Exemple

La suite des nombres impairs est une suite explicite.

Suite des nombres impair = (un) avec un=2*n-1, en démarrant avec n=1

(5)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 5/29

Suite récursive

Définition par récurrence

Une suite définie à l’aide de son premier terme et d’une relation entre des termes consécutifs est appelée « suite récursive ».

On dit d’une telle suite qu’elle est définie par récurrence.

A la place de définition par récurrence, on peut parler de définition récursive.

On appelle SR l’ensemble des suites récursives.

Exemple 1

Soit u(n) définie par u(0)=0 et un+1=2*un+1 u1=1 ; u2=3 ; u3=7 ; u4=15 ; u5=31 ; etc.

Exemple 2

On peut aussi définir la suite des nombres impairs par récurrence : Suite des nombres impairs (un) définie par u0=1 et un+1=un+2

Calculette, tableur, programmation

Le menu « suite » des calculettes permet d’obtenir les premiers termes d’une suite explicite ou récursive.

Un tableur permet de calculer simplement les termes d’une suite.

En programmation, les boucles permettent de calculer les termes d’une suite explicite ou récursive.

La récursivité est particulièrement adaptée pour calculer les termes d’une suite récursive.

(6)

Exercices

Exercice 1 : jeu de logique

1) Soit la suite logique suivante : 8, 10, 13, 17, 22, ...

Quel sera le nombre suivant ? Quelle est la définition récursive de cette suite ?

2) Soit la suite logique suivante : 1, 3, 15, 105, 945, ...

Quel sera le nombre suivant ? Quelle est la définition récursive de cette suite ?

3) Soit la suite logique suivante : 1, 2, 6, 42, 1806, ...

Quel sera le nombre suivant ? Quelle est la définition récursive de cette suite ? Ø Aide à la réflexion

Numérotez les termes de la suite, en partant de 0 ou de 1.

Essayer de trouver une formule explicite à partir des indices (ne cherchez pas trop !)

Essayer de trouver une formule de récurrence à partir de la valeur précédente. Eventuellement utilisez aussi l’indice.

Exercice 2 : suite explicite – Utilisation d’un tableur

• Calculer « à la main » les 3 premier termes de la suite explicite S1 définie par un=n2-n+1.

• Calculer les 50 premiers termes avec un tableur. Combien vaut u35 ?

Dans le tableur, la colonne A va servir à définir les valeurs de l’indice. Sur la 1ère ligne on met n, sur la 2ème ligne on met 1 (première valeur de n).

La colonne B va servir à définir les valeurs pour chaque un. Sur la 1ère ligne, on met S1, sur la 2ème ligne on écrit la formule : =A2*A2-A2+1

Ensuite, on sélectionne les deux colonnes A et B de la 2ème ligne et on « tire » la sélection vers le bas.

• On pose S2n=u0+u1+u2+… +un. S2, c’est la somme des termes de la suite S1.

Donnez la définition explicite et/ou récursive.

Calculez les 50 premières valeurs de S2 avec un tableur. Combien vaut S35 ? Dans le tableur, on ajoute une 3ème colonne. Sur la 1ère ligne, on met S2. Sur la 2ème ligne, on écrit la formule : =B2.

Sur la 3ème ligne, on écrit la formule : =C2 + B3.

Ensuite, on sélectionne la colonne C de la 3ème ligne et on « tire » la sélection vers le bas.

(7)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 7/29

Exercice 3 : suites récursives

• Calculer « à la main » les 3 premier termes des 3 suites récursives suivantes : Suite logique : u0=1 ; un+1=un*(un+1)

Suite de Fibonacci : u0=1 ; u1 =1 ; un+2=un+1+un

Suite de Syracuse : u0 : au choix ; un+1 = n pair ? un/2 : un*3+1

• Calculer les 50 premiers termes des 3 suites avec un tableur.

• Combien vaut u35 pour les 3 suites ? Ø Principes dans le tableur :

La colonne A correspondra à l’indice allant de 0 à 50

La colonne B correspondra au calcul de un. Chaque cellule est calculée en fonction de la ou des cellules précédentes sauf la première ou les deux premières qui sont fixes. Le calcul peut intégrer un test : =SI(test ; valeur si vrai ; valeur si faux). L’opérateur modulo est remplacée par une fonction : mod(nombre ; diviseur).

La colonne B sera utilisée pour la suite logique, la colonne C pour la suite de Fibonnacci, la colonne D pour la suite de Syracuse.

(8)

Suites arithmétiques et suites géométriques

Suite arithmétique : progression par une addition Suite arithmétique

Une suite est arithmétique si :

on passe d’un terme à l’autre en ajoutant toujours le même nombre.

La progression se fait par une addition.

L’ensemble des suites arithmétiques se note SA.

Définition récursive – raison d’une suite arithmétique

Les suites arithmétiques sont des suites récursives : un+1 = un+r On dit que « r » est la « raison » de la suite.

On appelle SAr l’ensemble des suites arithmétiques de raison r Propriété 1 : équivalence entre suite arithmétique et suite explicite

Toute suite arithmétique est une suite explicite dont on peut définir le terme général.

(un) ∈ SAr ( donc un définie par u0 et un+1 = un+r) ó (un) ∈ SE avec un = u0 + r*n

Ø Exemple 1

Soit (un) ∈ SA3 avec u0=5 et un+1=un + 3 On peut en déduire que : un = 5 + 3*n Vérifications :

n u0=5 et un+1 = un + 3 un= 5 + 3*n

0 u0=5 u0 = 5 + 3*0 = 5

1 u1=5 + 3 = 8 u1 = 5 + 3*1 = 8 2 u2=8 + 3 = 11 u2 = 5 + 3*2 = 11 Etc.

Ø Exemple 2

si (un) est définie par un = 4n+3 alors (un) est définie par u0 =3 et un+1=un+4

Propriété 2

De façon plus générale :

Si (un) ∈ SAr alors un=ui+r*(n-i) Ø Exercices

1. Démontrez la propriété 2 à partir de la propriété 1

(9)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 9/29

2. Le nombre 10 peut il être le premier terme d’une suite arithmétique (un) dont la raison est 3 et dont l’un des termes est 101 ? Si oui, le 101 est le combientième terme ?

3. Idem avec 103.

Propriété 3 : somme des termes consécutifs

Soit S la somme des termes consécutifs d’une suite arithmétique S = nombre de termes*(premier terme + dernier terme)/2

Ø Exercices

1. Définissez la suite des entiers positifs comme une suite arithmétique.

2. Calculez S1 = la somme des 1000 premiers entiers (de 0 à 1000).

3. Vérifiez qu’on obtient le même résultat avec la suite allant de 1 à 1000.

4. Quelle est la formule simplifiée de la somme de N premiers entiers.

5. Calculez S = la somme des 500 premiers entiers (de 1 à 500).

6. Calculez S5 = la somme des entiers de 501 à 1000.

7. Vérifiez que S2=S4+S5.

(10)

Suite géométrique : progression par une multiplication Suite géométrique

On dit qu’une suite est géométrique si :

on passe d’un terme à l’autre en multipliant toujours par le même nombre.

La progression se fait par une multiplication.

L’ensemble des suites géométriques se note SG.

Définition récursive – raison d’une suite géométrique

Les suites géométriques sont des suites récursives : un+1 = q * un

On dit que « q » est la « raison » de la suite.

On appelle SGq l’ensemble des suites géométriques de raison « q ».

Propriété 1 : équivalence entre suite géométrique et suite explicite

Toute suite géométrique est une suite explicite dont on peut définir le terme général.

(un) ∈ SGq ( donc un définie par u0 et un+1 = q * un) ó (un) ∈ SE avec un = u0 * qn

Ø Exemple 1

Soit (un) ∈ SG3 avec u0=5 et un+1 = 3 * un On peut en déduire que : un= 5 * 3n Vérifications :

n u0=5 et un+1 = 3 * un un = 5 * 3n

0 u0=5 u0 = 5 * 30 = 5 *1 = 5

1 u1=3 * 5 = 15 u1 = 5 * 31 = 5 * 3 = 15 2 u2=3 * 15 = 45 U2 = 5 * 32 = 5 * 9 = 45 Etc.

Ø Exemple 2

si un est définie par f(n)=3*2n alors un est défini par u0=3 et un+1=2*un

Propriété 2

De façon plus générale :

Si (un) ∈ SGq alors un=ui * qn-i Ø exercice

1. Démontrez la propriété 2 à partir de la propriété 1

2. Le nombre 3,75 peut il être le premier terme d’une suite géométrique (un) dont la raison est 2 et dont l’un des termes est 240 ? Si oui, le combientième terme est-ce ?

(11)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 11/29

Propriété 3 : somme des termes consécutifs

Soit S la somme des termes consécutifs d’une suite géométrique de raison q != 1 S = u0* (1 – qn ) / (1 – q)

Ø Exercices

Combien vaut la somme des puissances de 2 jusqu’à 210 : 20 + 21 + 22 + 23 + … + 210 1. Commencez par considérer chaque puissance de 2 comme le terme d’une suite et donnez la

définition récursive de la suite correspondante.

2. A partir de là, calculer la somme des puissances jusqu’à 210 en appliquant la propriété 3.

3. Ensuite donnez une définition récursive de la somme. Pour bien comprendre l’exercice, définissez som0, et par exemple som3 et som4. Définissez ensuite récursivement la somme.

4. Enfin, faites le calcul sous Excel dans un tableau à 3 colonnes : la première pour N, la deuxième pour la suite récursive des puissances de 2, la troisième pour la suite de la somme des puissances de 2.

(12)

Variations d’une suite et limite d’une suite

Suite croissante, décroissante, monotone

Si pour tout n, un+1 >= un alors la suite (un) est une suite croissante.

Si pour tout n, un+1 <= un alors la suite (un) est une suite décroissante.

Les suites croissantes et les suites décroissantes sont des suites monotones.

Les suites ni croissantes, ni décroissantes ne sont pas monotones.

Limites

Soit (un) une suite, quand « n » est très grand (tend vers l’infini), un peut tendre aussi vers +∞, vers −∞, ou vers une valeur déterminée appelée L (limite).

On écrit ∶ lim

/→1u/ = 𝐿 lim

/→1u/ = +∞ lim

/→1u/ = −∞

propriété

Soit (un) une suite, soient L et a deux nombres réels, si lim

6→1u6= L alors lim

6→1(u6 + a) = L + a

.

Propriétés des suites arithmétiques

Soit (un) ∈ SAr (donc un définie par u0 et un+1 = un+r ET un = u0 + r*n)

Si r > 0 alors (un) est une suite croissante et : lim

/→1u/ = +∞

Si r < 0 alors (un) est une suite décroissante et : lim

/→1u/ = −∞

Propriétés des suites géométriques

Soit (un) ∈ SGq (donc un définie par u0 et un+1 = q * un ET un = = u0 * qn)

Si 0 < q < 1 alors (un) est une suite décroissante et lim

/→1u/ = 0

Si q > 1 alors (un) est une suite croissante et : - Si a > 0 alors lim

/→1u/ = +∞

- Si a < 0 alors lim

/→1u/ = −∞

(13)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 13/29

Notion de conjecture

Quand on a une suite, on peut tester son évolution, par exemple sur un tableur, et faire une conjecture quant à sa variation et à sa limite.

Exercices

Déterminer les limites suivantes, mathématiquement (en appliquant les propriétés ou intuitivement) et dans un tableur (sous excel) :

A = lim

6→10,5/ B = lim

6→11,05/ C = lim

6→1(1,5/ − 10) D = lim

6→1(10 − 0,5/)

.

E = lim

6→15H/ F = lim

6→1(1 + 100 ∗ 5/ 6/ )

(14)

Exercices sur les suites avec excel

Série 1

On définit les sommes suivantes : A = 0,1 + 0,2 + 0,3 + … + 9,9 + 10 B = 2 + 4 + 6 + 8 + … + 998 + 1000

C = Somme des 500 premiers nombres impairs positifs D = 1+ 2 + 22 + 23 + …..230

E = v1 + v2 + … + v20. (vn) est une suite géométrique avec v0=10 et q=0,5

Ø Calculez les valeurs de A, B, D, D et E soit en utilisant excel, soit en donnant une formule permettant de calculer directement le résultat.

Série 2

1) Déterminez n tel que : 1+ 2 + 22 + 23 + …..2n = 2047

2) Soit la suite définie par un =1,5n + 9

• Quel est le premier n tel que un > 300 ? Et tel que un >1012

• Ecrivez 2 fonctions python qui calcule un : une itérative et une récursive.

• Ecrivez une autre fonction qui détermine le premier n tel que un > à une valeur donnée.

3) On achète un ordinateur portable 430 euros. On estime que sa valeur une fois achetée est donnée par la formule : un= 40 + 300*0,95n, n représentant le nombre de mois après l’achat.

• Combien vaut-il une fois acheté ? Et un an après l’achat ?

• A long terme, combien peut-on le vendre ?

• A partir de quand vaudra-t-il moins de 100 euros ?

(15)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 15/29

TP 1 : taux d’intérêt

Le taux d’intérêt du livret A est actuellement de 1,25% par an.

On place 1000 euros sur un livret.

1) Définissez la suite correspondant à la progression du placement.

2) Quel type de suite est-ce ?

3) Pouvez-vous calculer directement le montant du placement au bout de 5 ans ? 4) Au bout de combien de temps le placement atteindra-t-il 6000 euros ?

La question 3 peut se faire sans tableur.

On fera la question 4 avec un tableur. Cela permettra aussi de répondre à la question 3.

TP 2 : 7 milliards d’êtres humains, et moi et moi et moi !

La population mondiale était de 7,44 milliards d’habitants au 1er janvier 2017 (on estime qu’on était 1 milliard en 1800 et 2 milliards en 1930).

Le taux de croissance de la population est de 1,2% par an.

1) Donnez une estimation pour le 1er janvier 2018.

2) Définissez la suite correspondant à la progression.

3) Quel type de suite est-ce ?

4) Pouvez-vous calculer directement la population dans 10 ans ? 5) Quand dépasseront nous les 10 milliards ?

6) Faites une projection à 10 ans, 20 ans, 30 ans.

Faites un tableau avec l’année en cours : 2017, 2018, etc. et l’indice de la suite, c’est-à-dire la durée.

TP 3 : tableau d’amortissement d’un prêt

On emprunte 300 000 euros à 2% d’intérêt par an.

Le remboursement se fait sur 15 ans.

Chaque mois on rembourse une somme identique sauf le dernier mois où on rembourse moins de tel sorte que le prêt soit soldé.

Si on démarre le prêt au 1 mai 2017, la première échéance de remboursement à lieu le 1 mai. On veut que le 1er mai 2032 le montant à rembourser soit nul.

Chaque mois, à partir du 1er mai 2017, les intérêts courent, à raison de 2% divisé par 12 pour chaque mois.

Ø Premières questions :

1) De combien sera le remboursement mensuel 2) Quel sera le total payé

3) Quel sera le coût du prêt finalement (total payé – montant emprunté).

Pour répondre à ces questions, on va construire un tableau d’amortissement du prêt.

(16)

Ce tableau contient les colonnes suivantes :

• Numéro de l’échéances : de 1 à 12*15

• Taux d’intérêt : 2%. C’est une valeur fixe.

• Date d’échéance (le premier du mois).

• Montant à rembourser : 300 000 euros au départ. Diminue chaque mois pour arriver à 0. Si on a un prêt qui commence le 1 janvier de l’année N et qu’il dure un an, alors, le montant à rembourser le 1 janvier de l’année N+1 sera de 0.

• Mensualité (somme versée chaque mois) : c’est ce qu’on cherche. Elle est fixe sur toute la durée du prêt sauf pour la dernière mensualité qui permet de solder le prêt (mettre le montant à rembourser à 0). Cette dernière mensualité devra être le plus haut possible tout en restant plus petite que la mensualité normale.

• Intérêts mensuels : ce que nous coûte le prêt chaque mois

• Coût du prêt : totalisation de ce que coûte le prêt chaque mois

• Total payé : totalisation de ce qu’on a remboursé.

Ø Questions suivantes

On veut désormais emprunter 500 000 euros et le taux d’intérêt est de 3%. Le remboursement est prévu sur 20 ans.

1) De combien sera le remboursement mensuel 2) Quel sera le total payé

3) Quel sera le coût du prêt finalement (total payé – montant emprunté).

Ø Problème inverse : combien peut-on emprunter

Vous pouvez rembourser 1000 euros par mois. On vous propose un prêt à 2,5% sur 15 ans.

1) Combien pouvez-vous emprunter au maximum ?

(17)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 17/29

Algorithmique des suites – Algorithme itératif – Algorithme récursif

Exemple : la suite des sommes des n premiers nombres entiers Présentation

On considère la somme des n premiers nombres entiers. Par exemple : S5 =1+2+3+4+5.

On appelle (Sn) la suite des sommes des n premiers nombres entiers.

S0 = 0

S1 = 0 + 1 = 1 S2 = 0 + 1 + 2 = 3 Etc.

(Sn) = (0; 1; 3; 6; 10; 15; 21; 28; 36; etc.)

Suite récursive : définition récursive Ø Définition récursive

La suite des sommes des n premiers nombres entiers peut se définir comme une suite récursive : S3 = 0+1+2+3

S4 = 0+1+2+3+4 = S3 + 4 De façon générale :

(Sn) : S0 = 0 ; Sn = Sn-1 + n

Suite explicite : définition explicite et définition itérative Ø Définition explicite

La suite des sommes des n premiers nombres entiers peut se définir comme une suite explicite : (Sn) : Sn = n * (n + 1) / 2

Le terme général c’est : n * (n + 1) / 2 On peut parler de définition explicite.

Ø Définition itérative

Le terme général peut aussi être défini par une fonction somme : (Sn) : Sn = 0+1+2+ … + n-1 + n = /M∶N𝑖

Le terme général c’est : /M∶N𝑖

On peut parler d’une définition itérative.

(18)

Algorithmes correspondants

Algorithme explicite : pas de boucle

A partir de la définition explicite : Sn = n * (n + 1) / 2 :

l’algorithme pour calculer la somme des n premiers nombres est l’algorithme explicite, sans boucle, le plus simple :

Somme(n)

si n<0 return 0 ; return n*(n+1)/2

Algorithme itératif

A partir de la définition itérative : Sn = 0+1+2+ … + n-1 + n = /M∶N𝑖,

l’algorithme pour calculer la somme des n premiers nombres est l’algorithme itératif qui contient une boucle :

Somme(n)

si n<0 return 0 ; resultat = 0;

for(i=1 ; i<n+1 ; i++) resultat += i return somme

Algorithme récursif

A partir de la définition récursive : S0 = 0 ; Sn = Sn-1 + n

l’algorithme pour calculer la somme des n premiers nombres est un algorithme récursif. C’est la récursivité qui fait office de boucle :

Le principe de l’écriture d’un algorithme récursif à partir d’une définition récursive de suite est le suivant :

§ On commence par tester si on est sur u0 : c’est la condition de sortie de l’algorithme.

§ Ensuite, il n’y a plus qu’à faire l’appel récursif en appliquant la formule générale de la suite et à retourner le résultat.

Somme(n)

Si n<=0 return 0 ;

resultat = somme(n-1) + n ; return resultat ;

On peut aussi retourner le résultat en faisant l’appel récursif : Somme(n)

Si n<0 return 0 ; return somme(n-1) + n;

(19)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 19/29

Simulation de l’algorithme récursif : Somme(4)

return somme(4-1) + 4;

| return somme(3-1) + 3;

| | return somme(2-1) + 2;

| | | return somme(1-1) + 1;

| | | | return 0 | | | 0+1

| | 1+2 | 3+3 6+4 Fin

On peut aussi représenter la série des appels comme une arborescence (un arbre) avec un seul élément par sous niveau :

S(4)

S(4-1)

S(3-1)

S(2-1)

S(1-1)

return 0

(20)

Exercices

Démonstration géométrique

Démontrer que la somme des n premiers nombres vaut n(n+1)/2 avec un schéma suivant : 1 : * - - -

2 : * * - - 3 : * * * - 4 : * * * *

On considère le triangle des nombres à sommer (les étoiles). On remplit le carré correspondant.

A partir de là, démontrer la formule de la somme.

Factorielle N

On appelle (Fn) la suite des factorielles des n premiers nombres entiers > 0.

(Fn) = (1 ; 2 ; 6 ; 24 ; 120 ; 720 ; etc. )

(Fn) = (1 ; 1*2=2 ; 1*2*3=6 ; 1*2*3*4= 24 ; 1*2*3*4*5=120 ; etc)

1) Donnez les définitions itérative et récursive de la suite des factoriels.

2) Ecrivez les algorithmes de calcul correspondant aux définitions itératives et récursives.

3) Quelles sont les limites des deux versions.

Puissance N

1) Donnez les définitions explicite, itérative et récursive de la suite des puissances pour un entier donné.

Par exemple : (u(2)n) = (20=1 : 21=2 ; 22= 4 ; 23=8 ; etc.)

2) Ecrivez les algorithmes de calcul correspondant aux définitions itératives et récursives.

Suite de Fibonacci

La suite de Fibonacci est définie ainsi : (un) : u0=0 ; u1=1 ; un = un-2 + un-1 pour n > 1

1) Ecrivez les algorithmes de calcul itératifs et récursifs.

2) Ajouter un compteur dans les algorithmes qui permette d’afficher le nombre de boucle dans les deux cas.

L’utilisation ressemblera à ce code : cptfibo=0;

fiboIter(20);

print('cpt iter : ', cptfibo);

cptfibo=0;

fiboRec(20);

print('cpt iter : ', cptfibo);

La variable cptfibo sera une variable globale dans la fonction.

3) Que constatez-vous ?

4) Dessinez l’arbre des appels récursifs pour fiboRec(6) : on dessine une arborescence avec 2 éléments par sous niveau

(21)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 21/29

Fibo(6)

fibo(5) fibo(4)

fibo(4) fibo(3)

Une remarque sur la suite de Fibonacci : lim

6→1

OPQR(6SN)

OPQR(6) = nombre d’or = ϕ (phi) = (√5 + 1)/2

Tours de Hanoï

Ø Description du jeu

Le jeu est constitué d’une plaquette de bois où sont plantées trois tiges : les tours.

Sur ces tiges sont enfilées des disques de diamètres tous différents.

Les seules règles du jeu sont que l’on ne peut déplacer qu’un seul disque à la fois, et qu’il est interdit de poser un disque sur un disque plus petit.

Au début tous les disques sont sur la tige de gauche, et à la fin sur celle de droite.

Ø Méthode de résolution itérative

Déplacer le 1 à gauche (revenir à droite si on est déjà complètement à gauche).

Déplacer celui des deux qui n’est pas 1 et qu’on peut déplacer.

Répéter les deux opérations jusqu’au déplacement complet de la tour.

Ø Exercice :

Tester cette méthode avec 3 disques, 4 puis 5. Comptez le nombre d’itérations à chaque fois.

Ø Méthode de résolution récursive

L’idée est de trouver une méthode correspondant à une suite.

On appelle les tiges G, M, et D pour Gauche, Milieu et Droite.

Si on a 1 seul disque, il suffit de le déplacer de G vers D. On a u1.

Quelle relation peut-on établir en n disques et n-1 disques ? On veut un = f(un-1) Quand on a n disques, on fait les opérations suivantes sur n-1 disques :

1) on déplace les (n − 1) plus petits disques de G vers M 2) on déplace le plus gros disque de G vers D

3) on déplace les (n − 1) plus petits disques de M vers D.

On peut noter que dans les 2 cas de déplacement, le déplacement se fait de G vers D. De façon général, on peut dire qu’on déplace le disque du dessus.

Ø Exercice :

Ecrire l’algorithme récursif correspondant et afficher les tours à chaque mouvement.

Faire une simulation de l’algorithme récursif avec 4 niveaux.

(22)

Une subtilité est de faire passer les bonnes tours en paramètre quand on fait les déplacements.

Pour gérer un affichage minimum permettant de voir l’évolution des tours, on se dotera d’une fonction d’affichage des 3 tours.

On écrit donc 3 fonctions : afficher(), déplacer() et hanoi() qui est la fonction récursive.

En python, pour initialiser les tours, on pourra utiliser le code suivant : t1=['t1']

for i in range(n, 0, -1): t1.append(i) t2=['t2']

t3=['t3']

On pourra aussi utiliser la fonction « pop » qui permet de sortir le dernier élément d’une liste.

On se dotera d’une fonction de test qui sert de programme principal : test(n). On fournit n à la fonction test(), elle affiche les tours ainsi :

>>> test(3) --- ['t1', 3, 2, 1]

['t2']

['t3']

coup numéro 1 --- ['t1', 3, 2]

['t2']

['t3', 1]

coup numéro 2 --- ['t1', 3]

['t2', 2]

['t3', 1]

coup numéro 3 --- ['t1', 3]

['t2', 2, 1]

['t3']

coup numéro 4 --- ['t1']

['t2', 2, 1]

['t3', 3]

coup numéro 5 --- ['t1', 1]

['t2', 2]

['t3', 3]

coup numéro 6 --- ['t1', 1]

['t2']

['t3', 3, 2]

coup numéro 7 ---

(23)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 23/29

['t1']

['t2']

['t3', 3, 2, 1]

coup numéro 8 ---

>>>

Notez qu’on fait apparaître le numéro du coup joué.

(24)

Complexité des algorithmes

Présentation O(N)

La complexité est un ordre de grandeur théorique du temps d’exécution de l’algorithme.


Ce calcul concerne en général des algorithmes avec des boucles.


La mesure de la complexité est donnée par : « O ».


« O » signifie : « complexité de l’ordre de ».


On écrit : O(1) ou O(N) ou O(N/2) ou O(N2) pour une complexité de l’ordre de 1, de N, de N/2, de N2

Valeurs les plus courantes

1, N, N/2, 2N, N2, N2/2, racine(N), racine(N)/2, log2(N)etc.

Approximations 10 = 1 N+1 = N N2+N = N2 etc.

Exemple 1 : complexité de la recherche du plus petit diviseur

fonctionPPD (N) : entier // plus petit diviseur

Algo 1 : Algo 2 :

pour i de 2 à N-1 si N mod 2 == 0 : return 2

si N mod i = 0 : return i

finsi i=3

finpour tant que i*i <= N

return 1 Si N mod i = 0 : return i

i+=2 ; fintantque Return 1

Complexité: O(N) avec N=100 : O(100) Complexité : O (racine(N)/2) avec N=100 : O(5)

• La complexité est calculée à partir des boucles. Boucler de 2 à N-1 ou de 1 à N, c’est la même chose : de l’ordre de N. O(N-2) = O(N).

• Optimisation : on voit que qu’on a divisé par 20 le temps de calcul.

• Ce calcul est pour le cas général. Pour tous les nombres pairs, les algos vont à la même vitesse.

La plus grande différence aura lieu pour des grands nombres premiers.

(25)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 25/29

Exemple 2 : recherche d’une valeur dans un tableau

Fonction chercherVal (tab, N, val) : entier // indice de l’élément trouvé, -1 si pas trouvé

Algo :

pour i de 0 à N si tab[i] = val:

return i finsi finpour

return -1

Complexité: O(N) avec N=100 : O(100)

Classification des valeurs de complexité

• Temps constant : O(1)

• Temps linéaire : O(N)

• Temps proportionnel : O(N/2)

• Temps quadratique : O(N2)

• Temps quadratique amélioré : O(N2/2)

• Temps logarithmique : O(log2(N)) : c’est le cas de la recherche dichotomique. Rappel : si log2(N)

= X alors 2X=N. Par exemple : log2(1024) = 10 car 210=1024. Approximation : O(log2(N)) = O(1).

Objectifs de l’optimisation Passer en 1 ! évidemment.

Eviter les carrés N2 et surtout les cubes N3 ou plus ! Avec 1000 éléments, en N3 on est à 1 milliard, en N4 à 1000 milliards. Il faut donc éviter les boucles imbriquées. Au delà de 2, c’est suspect ! Diviser les carrés : N2/2, c’est toujours ça !

Et surtout, passer en log binaire : log2(N). Une boule en log binaire, c’est équivalent à : pas de boucle ! Passer en log binaire, cela veut dire : chercher si on peut traiter le problème en le divisant en 2 (ou plus) à chaque fois.

(26)

Exercice 1

• Calculer la complexité des fonctions suivantes.

• Déterminer la suite correspondant au nombre d’additions effectuées pour un n donné.

• Dire ce que fait le calcul.

• Calculer f(100) et g(100) sous excel ou en python, éventuellement avec une fonction récursive.

def f(n) : s=n;

s=s*(n+1) s=s/2 return s }

O( ? )

def f(n) : s=0

pour i de 1 à n { s=s+i

} return s }

O( ? )

def f(n) : s=0

pour i de 1 à n { pour j de 1 à n { s=s+1

} } return s }

O( ? )

def f(n) : s=0

pour i de 1 à n { pour j de 1 à i { s=s+1

} } return s }

O( ? )

(27)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 27/29

def g(n) : s=0

pour i de 1 à n { pour j de 1 à i { pour k de 1 à i { s=s+1

} } } return s }

O( ? )

# pour cette fonction on cherchera sur internet la formule de la somme des carrés

(28)

Tri à bulles

L’algorithme du tri à bulles est le suivant :

On inverse les valeurs 2 à 2 de la première à l’avant dernière, si la première est supérieure à la deuxième.

On recommence l’opération autant de fois -1 qu’il y a de valeurs dans le tableau.

Exemple avec le tableau : 6 10 5 8 12 4 On teste 6 et 10 et on ne fait rien

On teste 10 et 5 et on inverse : 6 5 10 8 12 4 On teste 10 et 8 et on inverse : 6 5 8 10 12 4 On teste 10 et 12 et on ne fait rien

On teste 12 et 4 et on inverse : 6 5 8 10 4 12 Le plus grand (12) est tout en bas.

Et on recommence :

On teste 6 et 5 et on inverse : 5 6 8 10 4 12 On teste 6 et 8 et on ne fait rien

Etc.

1. Codez cet algorithme.

2. Calculez le nombre de boucles de l’algorithme.

3. Mettez un compteur dans le programme pour vérifier le calcul.

4. Quelle est la complexité de l’algorithme ?

5. Quelle optimisation pourrait-on faire qui réduise le nombre de boucles ? 6. Calculez le nombre de boucle du nouvel algorithme.

7. Mettez un compteur dans le programme pour vérifier le calcul.

8. Quelle est la complexité de l’algorithme ?

9. Quelle autre optimisation pourrait-on faire ? 10. Quelle serait alors la complexité de l’algorithme ?

11. Faites un programme Python qui teste ces algorithmes, compte le nombre de passages dans les boucles et calcul la durée de traitement. Fonction shuffle pour mélanger un tableau.

Fonction time pour avoir la date-heure-seconde (une soustraction donnera une durée d’exécution).

(29)

Mathématiques appliquées à l’informatique – Suites – Récursivité - Complexité - page 29/29

Recherche dichotomique

On cherche une valeur dans un tableau. Dès qu’on la trouve, on renvoie l’indice correspondant dans le tableau. Si on ne la trouve pas en renvoie -1.

1. Codez une fonction qui résolve le problème avec une recherche séquentielle : on parcourt tout le tableau pour faire la recherche.

2. Quelle est la complexité de la fonction ?

On va maintenant considérer que le tableau est trié. La recherche dichotomique consiste à tester la valeur au milieu du tableau.

Si elle est plus petite que la valeur cherchée, alors on recommence l’opération dans le sous tableau allant du milieu à la fin.

Si elle lest plus grande que la valeur cherchée, alors on recommence l’opération dans le sous tableau allant du début au milieu.

On veut coder une fonction récursive qui fasse une recherche dichotomique.

Pour ça, on va traduire le problème sous la forme d’une suite en suivant les étapes ci-dessous :

3. Définissez les paramètres de la fonction

4. Pour chaque paramètre, définissez le u1 correspondant (sa valeur de départ) 5. Pour chaque paramètre, définissez le u2, le u3, le u4

6. Pour chaque paramètre, définissez la formule générale : un = f(un-1) 7. Une fois cela fait, écrivez la fonction récursive.

8. Mettez un compteur pour vérifier en combien de boucles le résultat est obtenu (pour le test, remplissez un grand tableau automatiquement : tab=[i for i in range(taille)];

9. Pour un tableau de 1000 éléments, combien de boucles fait-on ? 10. Pour un tableau de 10 000 éléments, combien de boucles fait-on ? 11. Quelle est la complexité de la fonction ?

Tours de Hanoï

Calculer la complexité de l’algorithme récursif des tours de Hanoï.

Références

Documents relatifs

D’après l’axiome de récurrence elle est donc vraie pour tout n ≥ 01. Comportement d’une suite définie par une relation

Cela prouve que (P n ) est une suite géométrique de

Cela prouve que (P n ) est une suite géométrique de

[r]

(Dans tout ce qui suit, si les menus ne correspondent pas à ceux de votre calculatrice, appuyez éventuellement plusieurs fois sur la touche EXIT et sur la touche

[r]

Un opérateur de téléphonie mobile constate que, chaque année, il perd 8% de ses précédents abonnés et que, par ailleurs, il gagne 3 millions de

[r]