Archives de catégorie : Non classé

Corrigé exercice 3 les arbres

Q1a
Nombre de nœuds = 7 (taille max pour une hauteur h : 2h – 1 = 1).
Q1b
profondeur maximale du nœud racine = 4
NB : par convention, ici un arbre réduit à un seul nœud est de hauteur 1
Q2
Taille : 7
Hauteur : 3 (par convention h(Δ) = 1)

Q3
Taille : 7
Hauteur : 4

Q4

def hauteur(self):
    return self.racine.hauteur()

Q5

def taille(self) -> int:
   if self.gauche == None and self.droite == None:
      return 1
   elif self.gauche == None:
      return 1 + self.droite.taille()
   elif self.droite == None:
      return 1 + self.gauche.taille()
   else:
      return 1 + self.gauche.taille() + self.droite.taille()
def taille(self):
   return self.racine.taille()

Q6a
2(h-1) – 1 < taille ≤ 2h – 1
doù t_min = 2(h-1) – 1

Q6b

def bien_construit(self) -> bool:
   return 2**(self.racine.hauteur() - 1) - 1 < self.racine.taille() <= 2**self.racine.hauteur() - 1

Corrigé exercice 2 les arbres

1.a. Il y a 4 feuilles, d’étiquette 12, val, 21 et 32.
1.b. Le sous-arbre gauche du nœud 23 est 19-21.
1.c. La hauteur de l’arbre est 4. Sa taille est 9.
1.d. Les valeurs possibles de val sont 16 et 17.

2.a. Parcours infixe : 12-13-15-16-18-19-21-23-32
2.b. Parcours suffixe : 12-13-16-15-21-19-32-23-18

3.a.


3.b.

racine = Noeud(18)
racine.insere([15, 13, 12, 16, 23, 32, 19, 21])

(d’autres solutions sont possibles)

3.c. bloc 3 – bloc 2
ne rentre pas dans bloc 1

4.

class Noeud():
    def __init__(self, v):
        self.ag = None
        self.ad = None
        self.v = v

    def insere(self, v):
        n = self
        est_insere = False
        while not est_insere:
            if v == n.v:
                est_insere = True
            elif v < n.v:
                if n.ag != None:
                    n = n.ag
                else:
                    n.ag = Noeud(v)
                    est_insere = True
            else:
                if n.ad != None:
                    n = n.ad
                else:
                    n.ad = Noeud(v)
                    est_insere = True

    def insere_tout(self, vals):
        for v in vals:
            self.insere(v)

    def recherche(self, v):
        arbre = self
        while not arbre is None:
            if arbre.v == v:
                return True
            if v < arbre.v:
                arbre = arbre.ag
            else:
                arbre = arbre.ad
        return False


    # version récursive (non demandée)

    def recherche_rec(self, v):
        if self is None:
            return False
        if self.v == v:
            return True
        if v < self.v:
            if self.ag is not None:
                return self.ag.recherche_rec(v)
            else:
                return False
        else:
            if self.ad is not None:
                return self.ad.recherche_rec(v)
            else:
                return False


racine = Noeud(18)
racine.insere_tout([12, 13, 15, 14, 19, 21, 32, 23])
print(racine.recherche(149))
print(racine.recherche(12))

Exercices -Arbres

Exercice 1

2021, sujet 0

Question 1

Déterminer la taille et la hauteur de l’arbre binaire suivant : image

Question 2

On décide de numéroter en binaire les nœuds d’un arbre binaire de la façon suivante :

  • la racine correspond à 1 ;
  • la numérotation pour un fils gauche s’obtient en ajoutant le chiffre 0 à droite au numéro de son père ;
  • la numérotation pour un fils droit s’obtient en ajoutant le chiffre 1 à droite au numéro de son père ;

Par exemple, dans l’arbre ci-dessous, on a utilisé ce procédé pour numéroter les nœuds A, B, C, E et F .

image
  1. Dans l’exemple précédent, quel est le numéro en binaire associé au nœud G ?
  2. Quel est le nœud dont le numéro en binaire vaut 13 en décimal ?
  3. En notant h la hauteur de l’arbre, sur combien de bits seront numérotés les nœuds les plus en bas ?
  4. Justifier que pour tout arbre de hauteur h et de taille n ≥ 2, on a : h ≤ n ≤ 2h − 1.

Question 3
Un arbre binaire est dit complet si tous les niveaux de l’arbre sont remplis. image

On décide de représenter un arbre binaire complet par un tableau de taille n + 1, où n est la taille de l’arbre, de la façon suivante :

  • La racine a pour indice 1 ;
  • Le fils gauche du nœud d’indice i a pour indice 2 × i ;
  • Le fils droit du nœud d’indice i a pour indice 2 × i + 1 ;
  • On place la taille n de l’arbre dans la case d’indice 0

Répondre aux questions suivantes :

  1. Déterminer le tableau qui représente l’arbre binaire complet de l’exemple précédent.
  2. On considère le père du nœud d’indice i avec i ≥ 2. Quel est son indice dans le tableau ?

Question 4

On se place dans le cas particulier d’un arbre binaire de recherche complet où les nœuds contiennent des entiers et pour lequel la valeur de chaque noeud est supérieure à celles des noeuds de son fils gauche, et inférieure à celles des noeuds de son fils droit.

Écrire une fonction recherche ayant pour paramètres un arbre arbre et un élément element. Cette fonction renvoie True si element est dans l’arbre et False sinon. L’arbre sera représenté par un tableau comme dans la question précédente. corrigé

Corrigé

merci à G.Lassus

Exercice 2

2021, Métropole sujet 1, exercice 1

Dans cet exercice, les arbres binaires de recherche ne peuvent pas comporter plusieurs fois la même clé. De plus, un arbre binaire de recherche limité à un nœud a une hauteur de 1. On considère l’arbre binaire de recherche représenté ci-dessous (figure 1), où val représente un entier :

image

1.a Donner le nombre de feuilles de cet arbre et préciser leur valeur (étiquette).

1.b Donner le sous arbre-gauche du nœud 23.

1.c Donner la hauteur et la taille de l’arbre.

1.d Donner les valeurs entières possibles de val pour cet arbre binaire de recherche.

On suppose, pour la suite de cet exercice, que val est égal à 16.

2. On rappelle qu’un parcours infixe depuis un nœud consiste, dans l’ordre, à faire un parcours infixe sur le sous arbre-gauche, afficher le nœud puis faire un parcours infixe sur le sous-arbre droit.
Dans le cas d’un parcours suffixe, on fait un parcours suffixe sur le sous-arbre gauche puis un parcours suffixe sur le sous-arbre droit, avant d’afficher le nœud.

a. Donner les valeurs d’affichage des nœuds dans le cas du parcours infixe de l’arbre.
b. Donner les valeurs d’affichage des nœuds dans le cas du parcours suffixe de l’arbre.

3. On considère la classe Noeud définie de la façon suivante en Python :

image

a. Représenter l’arbre construit suite à l’exécution de l’instruction suivante :

racine = Noeud(18)
racine.insere_tout([12, 13, 15, 16, 19, 21, 32, 23])

b. Écrire les deux instructions permettant de construire l’arbre de la figure 1. On rappelle que le nombre val est égal à 16.

c. On considère l’arbre tel qu’il est présenté sur la figure 1. Déterminer l’ordre d’exécution des blocs (repérés de 1 à 3) suite à l’application de la méthode insere(19) au nœud racine de cet arbre.

4. Écrire une méthode recherche(self, v) qui prend en argument un entier v et renvoie la valeur True si cet entier est une étiquette de l’arbre, False sinon.

corrigé

Exercice 3

2021, Métropole Candidats Libres 2, exercice 3

On rappelle qu’un arbre binaire est composé de nœuds, chacun des nœuds possédant éventuellement un sous-arbre gauche et éventuellement un sous-arbre droit. Un nœud sans sous-arbre est appelé feuille. La taille d’un arbre est le nombre de nœuds qu’il contient ; sa hauteur est le nombre de nœuds du plus long chemin qui joint le nœud racine à l’une des feuilles. Ainsi la hauteur d’un arbre réduit à un nœud, c’est-à-dire la racine, est 1.

Dans un arbre binaire de recherche, chaque nœud contient une clé, ici un nombre entier, qui est :

  • strictement supérieure à toutes les clés des nœuds du sous-arbre gauche ;
  • strictement inférieure à toutes les clés des nœuds du sous-arbre droit.

Un arbre binaire de recherche est dit « bien construit » s’il n’existe pas d’arbre de hauteur inférieure qui pourrait contenir tous ses nœuds.

On considère l’arbre binaire de recherche ci-dessous.

image

1.a. Quelle est la taille de l’arbre ci-dessus ?

1.b. Quelle est la hauteur de l’arbre ci-dessus ?

2. Cet arbre binaire de recherche n’est pas « bien construit ». Proposer un arbre binaire de recherche contenant les mêmes clés et dont la hauteur est plus petite que celle de l’arbre initial.

3. Les classes Noeud et Arbre ci-dessous permettent de mettre en œuvre en Python la structure d’arbre binaire de recherche. La méthode insere permet d’insérer récursivement une nouvelle clé.

class Noeud :

    def __init__(self, cle):
        self.cle = cle
        self.gauche = None
        self.droit = None

    def insere(self, cle):
        if cle < self.cle :
            if self.gauche == None :
                self.gauche = Noeud(cle)
            else :
                self.gauche.insere(cle)
        elif cle > self.cle :
            if self.droit == None :
                self.droit = Noeud(cle)
            else :
                self.droit.insere(cle)

class Arbre :

    def __init__(self, cle):
        self.racine = Noeud(cle)

    def insere(self, cle):
        self.racine.insere(cle)

Donner la représentation de l’arbre codé par les instructions ci-dessous.

a = Arbre(10)
a.insere(20)
a.insere(15)
a.insere(12)
a.insere(8)
a.insere(4)
a.insere(5)

4. Pour calculer la hauteur d’un arbre non vide, on a écrit la méthode ci-dessous dans la classe Noeud.

def hauteur(self):
    if self.gauche == None and self.droit == None:
        return 1
    if self.gauche == None:
        return 1 + self.droit.hauteur()
    elif self.droit == None:
        return 1 + self.gauche.hauteur()
    else:
        hg = self.gauche.hauteur()
        hd = self.droit.hauteur()
        if hg > hd:
            return hg + 1
        else:
            return hd + 1

Écrire la méthode hauteur de la classe Arbre qui renvoie la hauteur de l’arbre.

5. Écrire les méthodes taille des classes Noeud et Arbre permettant de calculer la taille d’un arbre. corrigé Méthode de la classe :

6. On souhaite écrire une méthode bien_construit de la classe Arbre qui renvoie la valeur True si l’arbre est « bien construit » et False sinon.

On rappelle que la taille maximale d’un arbre binaire de recherche de hauteur est 2h-1.

.

6.a Quelle est la taille minimale, notée min d’un arbre binaire de recherche « bien construit » de hauteur h?

6.b Écrire la méthode bien_construit demandée.

corrigé

Corrigé exercice 1 les arbres

Q1 La taille est 9, la hauteur est 4.
Q2 1. G est associé à 1010.
Q2 2. 13 s’écrit 1101 en binaire, c’est donc le nœud I.
Q2 3. Les nœuds les plus en bas sont notés sur bits.
Q2 4. L’arbre de hauteur de taille minimale est l’arbre filiforme, qui est de taille .
L’arbre de hauteur de taille maximale est l’arbre complet, qui est de taille . Si est la taille d’un arbre quelconque de taille

, on a donc bien $$ h \leqslant n \leqslant 2^h-1 $$.

Q3 1. Tableau : [15, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O] .
Q3 2. Le père du nœud d’indice i a pour indice i//2.

Q4 :





def recherche(arbre, element):
    i = 1
    while i < len(arbre):
        if arbre[i] == element:
            return True
        if element < arbre[i]:
            i = 2*i # on se place sur le fils gauche
        else:
            i = 2*i +  1 # on se place sur le fils droit
    return False

1- Les variables

Merci à David Roche pour son travail que vous pouvez retrouver sur son site.

Le langage que nous allons utiliser en NSI est Python, pour écrire nos programmes nous devons utiliser un éditeur (IDE , Integrated Development Environment).

Il en existe une multitude, nous utiliserons Thonny. Vous pouvez l’installer chez vous en suivant les indications sur le site thonny.org.

Prise en main de Thonny

Thonny lancé, à l’écran vous devriez avoir ceci:

Thonny possède plusieurs fenêtres. Pour les faire apparaitre ou disparaitre, cliquer dans le menu Affichage et cochez celles qui vous intéressent. Nous en utiliserons 3 en particulier, la fenêtre Éditeur (qui permet de saisir les lignes de programme), la fenêtre Console (interpréteur interactif qui permet l’interaction entre le programme et l’utilisateur) et la fenêtre Variables (qui affiche l’état des variables).

À faire vous-même 1

Dans la fenêtre « Éditeur« , saisir le programme suivant :

print("hello world !")

puis lancer votre programme (en appuyant sur F5 ou en cliquant sur la flèche blanche sur fond vert) (avant la première exécution on vous demandera d’enregistrer votre programme, faites attention ou vous stockez vos fichiers…)

le message hello world ! doit apparaître dans la console:

Notion de variable

Définition du mot ordinateur d’après « Le Petit Larousse » :

« Machine automatique de traitement de l’information, obéissant à des programmes formés par des suites d’opérations arithmétiques et logiques. »

Qui dit « traitement de l’information », dit donc données à manipuler. Un programme « passe » donc son temps à traiter des données. Pour pouvoir traiter ces données, l’ordinateur doit les ranger dans sa mémoire (RAM – Random Access Memory). La RAM se compose de cases dans lesquelles nous allons ranger ces données (une donnée dans une case). Chaque case a une adresse (ce qui permet au processeur de savoir où sont rangées les données).

Alors, qu’est-ce qu’une variable ?

Eh bien, c’est une petite information (une donnée) temporaire que l’on stocke dans une case de la RAM. On dit qu’elle est « variable », car c’est une valeur qui peut changer pendant le déroulement du programme.

Une variable est constituée de 2 choses :

  • Elle a une valeur : c’est la donnée qu’elle « stocke » (par exemple le nombre entier 5)
  • Elle a un nom : c’est une étiquette qui permet de la reconnaître. Nous n’aurons pas à retenir l’adresse de mémoire, nous allons juste indiquer des noms de variables à la place.
i = 12			

Grâce à cette ligne, nous avons défini une variable qui porte le nom i et qui « contient » le nombre entier 12. Plus précisément, nous dirons que la variable i référence le nombre entier 12.

À faire vous-même 2

Dans la partie « éditeur » de Thonny, saisir le code suivant :

point_de_vie = 15			

Après avoir exécuté le programme en cliquant sur Executer le script courant, il est possible de connaître la valeur référencée par une variable en utilisant la partie « console » de Thonny.

Dans le cas qui nous intéresse ici, taper point_de_vie dans la console

Après avoir appuyé sur la touche « Entrée« , vous devriez voir la valeur référencée par la variable point_de_vie s’afficher dans la console.

N.B. : Dans la suite, la procédure sera toujours la même :

  • Vous utiliserez la partie « éditeur » pour saisir votre programme
  • vous utiliserez la partie « console » pour afficher la valeur référencée par une variable

À faire vous-même 3

Écrire un programme dans lequel on attribue la valeur 12 à la variable point_de_force. La valeur référencée par la variable point_de_force devra ensuite être affichée dans la console.


Nous venons de voir qu’une variable peut référencer un nombre entier, mais elle peut aussi référencer un nombre à virgule :

i = 5.2			

Prenez bien garde, nous utilisons un point à la place d’une virgule (convention anglo-saxonne).

Une variable peut donc référencer plusieurs types d’entités (pour l’instant nous n’en avons vu que deux, mais nous en verrons d’autres plus loin) : les nombres entiers (« integer » en anglais, abrégé en « int« ) et les nombres à virgule (« float » en anglais). Il est possible de connaitre le type de l’entité référencé par une variable à l’aide de l’instruction « type« .

À faire vous-même 4

Tester le programme suivant :

a = 5.2
b = 12			

taper type(a) puis type(b) dans la console

Comme vous pouvez le constater, le type de la grandeur référencée par la variable a et le type de la grandeur référencée par la variable b s’affichent dans la console


Un peu de calculs

Un ordinateur est bien évidemment capable d’effectuer des opérations mathématiques (arithmétiques).

Les signes utilisés sont classiques : +, – , * (multiplication), / (division), // (division euclidienne) ou encore % (modulo : reste d’une division euclidienne).

Il est tout à fait possible d’effectuer des opérations directement avec des nombres, mais il est aussi possible d’utiliser des variables.

À faire vous-même 5

Essayer d’écrire un programme qui additionnera le contenu de 2 variables (nom des variables : nombre_1 et nombre_2). Le résultat de cette opération devra être référencé par une troisième variable nommée resultat (attention pas d’accent dans les noms de variable). Tester votre programme en utilisant la console pour vérifier la valeur référencée par la variable résultat.


À faire vous-même 6

D’après vous, que fait ce programme ?

nombre = 11
nombre = nombre + 1			

Vérifier votre réponse en exécutant le programme (utilisation dans console pour déterminer la valeur référencée par la variable nombre à la fin du programme)


Détaillons ce qui se passe dans le « À faire vous-même 6« :

  • nous créons une variable nombre qui référence l’entier 11
  • nous affichons à l’écran la valeur référencée par nombre (c’est-à-dire 11)

La suite est un peu plus complexe, mais très importante à comprendre. Il va falloir lire la ligne  » nombre = nombre + 1″ de droite à gauche, décortiquons cette ligne :

  •  » nombre + 1″ : nous prenons la valeur actuelle de nombre (c’est-à-dire 11) et nous ajoutons 1 à 11, à droite de l’égalité nous avons donc maintenant la valeur 12
  • nous attribuons la valeur qui vient d’être calculée à la variable nombre
  • nous affichons à l’écran la nouvelle valeur référencée par nombre

Ce raisonnement peut être généralisé pour éviter des erreurs parfois difficiles à corriger : dans une égalité, commencer toujours par évaluer l’expression se trouvant à droite du signe égal.

Exposant, racine carrée, fonctions trigonométriques

Il est aussi possible d’effectuer des calculs plus complexes en utilisant par exemple des exposants, des racines carrées, des fonctions trigonométriques…

Pour utiliser ces fonctions mathématiques plus avancées, il est nécessaire d’ajouter une ligne au début de votre programme :

import math			

Cette ligne permet d’importer (et donc d’utiliser) le module « math » (ce module contient toutes les fonctions mathématiques « classiques »).

Voici quelques exemples :

  • math.pow(x,a) permet de calculer x à la puissance a
  • math.cos(x) permet de calculer le cosinus de l’angle x (l’angle x doit être en radian) (nous avons la même chose pour le sinus ou la tangente)
  • math.sqrt(x) permet de calculer la racine carrée de x

Si vous avez besoin d’autres fonctions mathématiques, consulter la documentation de Python : https://docs.python.org/3/library/math.html

À faire vous-même 7

Quelles sont les valeurs référencées par les variables d, e, f, g, h et i après l’exécution du programme suivant :

import math
a = 5
b = 16
c = 3.14 / 2
d = b / a
e = b // a
f = b % a
g = math.pow(a,2)
h = math.sqrt(b)
i = math.sin(c)			

Vérifiez vos réponses à l’aide de la console


À noter qu’il est tout à fait possible de « mélanger » des nombres entiers et des nombres à virgules (« 3.14 / 2 ») dans une opération.

À faire vous-même 8

Écrire un programme permettant de répondre à la question suivante : « Quel est le type du résultat d’une addition d’un integer et d’un float ? »


Chaînes de caractères

Les variables peuvent aussi référencer des suites de caractères, que l’on appelle « chaîne de caractères ».

À faire vous-même 9

Tester le code suivant :

ma_chaine = "Bonjour le monde !"			

Vérifiez que la variable ma_chaine référence la chaîne de caractères « Bonjour le monde ! »


Le signe + et les chaînes de caractères

L’utilisation du signe + ne se limite pas à l’addition. Il est aussi utilisé pour la concaténation.

D’après Wikipédia :

« Le terme concaténation (substantif féminin), du latin cum («avec») et catena(«chaîne, liaison»), désigne l’action de mettre bout à bout au moins deux chaînes. »

Comme vous avez pu le deviner en lisant la définition ci-dessus, la concaténation va concerner les chaînes de caractères.

À faire vous-même 10

Quelle est la chaîne de caractère référencée par la variable mon_expression après l’exécution du programme ci-dessous ? Validez votre réponse en testant ce programme.

a = "Hello"
b = "World"
mon_expression = a + b			

Chaînes de caractères et variables

Il est aussi possible de concaténer une chaîne de caractères et une ou plusieurs variables :

À faire vous-même 11

Tester le code suivant :

ma_chaine_1 = "Bonjour "
ma_chaine_2 = "le "
res = ma_chaine_1 + ma_chaine_2 + "monde!"		

Les 2 variables ma_chaine_1 et ma_chaine_2 référencent 2 chaînes de caractères, nous avons donc bien ici une concaténation.

Mais que se passe-t-il si la variable référence un nombre (entier ou flottant) ?

À faire vous-même 12

Tester le code suivant :


mon_nombre = 5
res = "Nombre de personnes : " + mon_nombre

Comme vous pouvez le constater, nous avons droit à une erreur. En effet, il n’est pas possible de concaténer une chaîne de caractères et un nombre.

Python nous offre 2 solutions :

  • l’utilisation de la méthode « str »
  • l’utilisation des « fstring »

La méthode (nous verrons plus loin la notion de méthode) « str » permet de transformer un nombre en chaîne de caractères (si la transformation n’est pas possible, nous aurons une erreur)

À faire vous-même 13

Tester le code suivant :

mon_nombre = 5
mon_nombre = str(mon_nombre)		

Quel est le type de la valeur référencée par la variable mon_nombre après l’exécution du programme ci-dessus ?


À faire vous-même 14

Tester le code suivant :

mon_nombre = 5
res = "Nombre de personnes : "  + str(mon_nombre)

Tout fonctionne, car maintenant nous avons bien une concaténation entre 2 chaînes de caractères.


Les « fstring » (nouveauté de Python 3.5), permettent de résoudre ce problème de combinaison variable-chaîne de caractères.

À faire vous-même 15

Tester le code suivant :

mon_nombre = 5
res = f"Nombre de personnes : {mon_nombre}"	

Notez la présence du « f » juste avant le guillemet et des accolades qui encadrent le nom de la variable. Il est possible, dans une même chaîne de caractères d’avoir plusieurs noms de variable.

Suite : les expressions et les booléens

Compresser des fichiers pour envoi sur dépôt pronote

Pour compresser des fichiers et les déposer sur pronote, ouvrir le dossier contenant les fichiers à compresser afin de ne faire qu’un seul fichier avec l’extension .zip.

Pour les sélectionner, faire un cliquer-glisser ou appuyer sur CTRL+A.

Cliquer alors avec le bouton droit et sélectionner : « Envoyer vers » – >  » Fichier compressé« 

Changer éventuellement le nom du fichier, et vous pouvez le déposer dans le dépôt Prononte !

Outils en ligne

Environnement de développement Python en ligne pour travailler la programmation sur n’importe quel appareil sans installation

Replit.com

Environnement Linux (Debian) en ligne :

  • Cocalc (l’enregistrement est facultatif mais vous permettra de retrouver votre travail).
  • Webminal est une alternative très intéressante mais l’enregistrement est obligatoire et nécessite une adresse mail.

Le principe du “diviser pour régner” en Python EXERCICES

Exercice 1: Recherche valeur dans une liste

Algorithme:

fonction chercher : (tableau, clé) —-> booléen
1. Pour un tableau de taille 1, il contient la clé si valeur est la clé
2. On sépare le tableau en deux parties sensiblement de même taille (gauche et droite)
3. Le tableau contient la clé si
chercher(gauche, clé) ou chercher(droite, clé)
est vrai.


Exemple
tableau = [4, 10, 20, 5]
clé = 10
A-t-on clé dans tableau ?
Exemple
clé = 10
[4, 10, 20, 5]

diviser [4, 10] [20, 5]

diviser [4] [10] [20] [5]

combiner Faux ou Vrai Faux ou Faux

combiner Vrai ou Faux

combiner Vrai

Implémenter cette fonction sous python.

Exercice 2: Calcul y puissance x

On souhaite calculer N=752. La méthode basique consiste à multiplier le nombre 7 par lui-même 52 fois… Ce qui n’est pas très rapide !

L’idée consiste donc à diviser le problème en 2 : on va calculer  726× 726, c’est-à-dire( 726)2. Là, il n’y a plus que 26 + 1 opérations (26 multiplications pour calculer 726, et une dernière pour faire le carré du résultat.

On recommence ensuite avec 726 : on le calcule en faisant (713)2.

 N se calcule alors en 13+1+1 opérations au lieu de 52 initialement.

On ne s’arrête pas là, bien entendu : on continue tant que l’on peut utiliser ce principe :

N=752

=(726)2

=((713)2)2

=[[(76)2×7]2]2

=[[((73)2)2×7]2]2

=[[((72×7)2)2×7]2]2

Le principe est, vous l’avez peut-être remarqué, récursif.

Implémentation en Python du “diviser pour régner”

Nous allons écrire une fonction “puissance(x,n)” basée sur ce paradigme, où x et n sont deux entiers (positif pour n). Pour cela, nous allons prendre en compte que:

Implémenter cette fonction avec python

Exercice 3: Faire pivoter une image