BTS CIRA première année

programme du BTS

Première annéeDeuxième année
Retour sur les bases de calculsSéries de Fourier
Fonctions usuellesTransformation de Laplace
Fonctions trigonométriquesTransformation en Z
ComplexesFonctions à plusieurs variables
Calcul intégral / PrimitivesCalculs Vectoriels
Equations différentiellesModélisation Géométrique
Développements limitésCalcul Matriciel
Suites numériquesStatistiques Descriptives
Probabilités
Statistiques Inférentielles

Les fonctions

Retour sur les bases de calculs

Complexes

Primitives et intégrales

sujet d’annales :

  • tous les sujets : APMEP (sélectionner le groupement A)

divers

La Récursivité


🧐 Qu’est-ce que la Récursivité ?

Imaginez un miroir face à un autre miroir… on voit des reflets de reflets, à l’infini ! La récursivité, c’est un peu ça en programmation. C’est quand une fonction s’appelle elle-même pour résoudre un problème. Ça peut sembler un peu bizarre au début, mais vous allez voir que c’est une idée géniale !

🏃‍♀️ Rappel : Les fonctions qui s’appellent !

Avant de parler de récursivité, rafraîchissons-nous la mémoire sur le fonctionnement des appels de fonctions.

Mini-Challenge 1 : Le Détective de Fonctions 🕵️‍♀️

Analysez et testez ce programme. Essayez de prédire l’ordre d’exécution !

Python

def reveil():
    print("Tic...")
    dodo()
    print("...Tac !")

def dodo():
    print("Zzzzz...")
    # Et si on appelait reveil() ici ? Essayez !
    print("...Mmmh !")

print("Journée qui commence !")
reveil()
print("Journée qui finit !")


Vous avez remarqué que quand reveil() appelle dodo(), l’exécution de reveil() se met en pause. C’est comme si reveil() disait : « Hé, dodo() ! Fais ton truc, et quand tu as fini, dis-le-moi pour que je reprenne ! ».

Pour gérer ça, Python (et la plupart des langages de programmation) utilise une pile d’exécution (ou « call stack »). C’est une sorte de pile de Post-it où chaque Post-it représente une fonction en cours d’exécution. La fonction au sommet est celle qui travaille, et celles en dessous attendent patiemment leur tour. Quand une fonction a fini, son Post-it est retiré du dessus de la pile.

C’est aussi grâce à cette pile que les variables locales à chaque fonction restent bien séparées. Le i de reveil() n’est pas le même que le i de dodo(), même s’ils ont le même nom ! C’est comme si chaque Post-it avait sa propre petite liste de courses.


😱 La Récursivité : Attention à la Boucle Infinie !

Maintenant, imaginez que notre fonction reveil() s’appelle elle-même !

Mini-Challenge 2 : La Cascade Infernale 🌊

Analysez et testez ce programme. Que se passe-t-il ? Pourquoi ?

Python

def chute_libre():
    print("Aïe !")
    chute_libre() # On s'appelle soi-même !

chute_libre()

Vous avez dû voir une erreur : RecursionError: maximum recursion depth exceeded. 🤯 C’est Python qui lève le drapeau rouge ! La pile d’exécution a grandi, grandi, grandi… sans jamais que les fonctions ne se terminent. C’est une boucle infinie récursive !

Pour qu’une fonction récursive soit utile, elle doit avoir une condition d’arrêt (ou « cas de base »). C’est le moment où la fonction ne s’appelle plus elle-même et renvoie une valeur. Sans ça, c’est le crash assuré !


🌟 La Magie de la Récursivité : Exemples Concrets

La récursivité est parfaite pour les problèmes qui peuvent être décomposés en sous-problèmes plus petits, mais de même nature.

🔢 L’Escalier Numérique 🪜

Imaginons que nous voulions afficher les nombres de 0 à n en partant de 0.

Mini-Challenge 3 : Prédiction et Vérification 🔮

Essayez de prévoir ce que va afficher le programme suivant. Puis, testez-le !

Python

def compte_a_rebours(n):
    if n < 0: # Notre condition d'arrêt !
        return
    print(n)
    compte_a_rebours(n - 1)

compte_a_rebours(3)

Maintenant, si on voulait compter de 0 à n dans l’ordre croissant, il suffirait de changer l’ordre de print(n) et de l’appel récursif.

Python

def compte_en_avant(n):
    if n < 0:
        return
    compte_en_avant(n - 1)
    print(n) # L'affichage se fait après l'appel récursif !

compte_en_avant(3)

Remarquez la subtilité ! Dans compte_a_rebours, on affiche avant l’appel récursif, donc l’ordre est décroissant. Dans compte_en_avant, on affiche après l’appel récursif, donc l’ordre est croissant, car les print sont exécutés au moment où les fonctions sont « dépilées » de la pile ! C’est un point crucial à comprendre.


Amusons nous avec les suites , tout de suite

une bonne partie des suites vues en cours de mathématiques sont des suites définies par récurrence, elle se prêtent particulièrement bien à une utilisation des fonctions récursives. Nous allons nous intéresser à une suite définie de la manière suivante : u_{0}=5 et : u_{n+1} = 3/4*u_{n} + 11.

On peut accéder assez facilement à n’importe quel terme à l’aide d’une boucle.

n=int(input("quel terme voulez vous ? "))
u = 5
for i in range(1,n+1) :
     u = 3/4*u + 11
print(f"le {n}ième terme est {u}")

mais un tel programme n’a pas vraiment de rapport avec le cœur du chapitre, on peut raisonner à l’envers en exprimant u_4 à partir de u_3 qui lui sera exprimé à partir de u_2 etc

def u(n):
    if n == 0 : return 5
    return 3/4*u(n-1) + 11

n=int(input("quel terme voulez vous ? "))

print(f"le {n}ième terme est {u(n)}")

la récurrence est en quelque sorte tournée vers l’arrière, le présent est une fonction du passé.

Il y a moyen d’aller de l’avant, mais avec les suites qui sont infinies ça peut durer longtemps. On a besoin de trouver un point d’arrêt futur.

Imaginons que pour la suite précédente on ait remarqué que la suite converge vers 44, et que l’on ait envie de savoir quand est ce que l’on arrive à une distance epsilon de cette limite.

def verif(epsilon,n=0,u=5):
    #print("début de l'appel n°",n) # juste pour arriver à mieux comprendre ce qui se joue
    if abs(u-44)<epsilon :
         print("on y arrive pour n =",n)
         return
    verif(epsilon,n+1,3/4*u+11)
    #print("début de l'appel n°",n) # juste pour arriver à mieux comprendre ce qui se joue

verif(0.01)


🎨 La Beauté des Fractales avec Turtle 🐢

La récursivité est la reine des fractales, ces formes géométriques complexes qui se répètent à l’infini à différentes échelles. Le flocon de Koch est un exemple magnifique.

Le Flocon Magique ❄️

Regardez cette vidéo sur le flocon de Koch (ou cherchez « flocon de Koch animation » si le lien ne marche pas).

Ensuite, analysez et testez le code suivant. Concentrez-vous sur les paramètres longueur et n (le nombre d’étapes de récursivité).

Le secret du flocon de Koch réside dans la fonction koch : si n est 0, on dessine juste un segment droit. Sinon, on remplace ce segment par 4 segments plus petits, en tournant de 60 ou 120 degrés, et on appelle koch récursivement pour chacun de ces segments ! C’est le principe des fractales : une petite partie ressemble au tout.

correction


🚀 Étendre vos Horizons : Quand utiliser la Récursivité ?

La récursivité est un outil puissant, mais ce n’est pas toujours la meilleure solution.

Quand la récursivité brille ✨:

  • Structures de données récursives : Arbres, listes chaînées… Parcourir ces structures est souvent très élégant avec la récursivité.
  • Problèmes définis récursivement : La factorielle, la suite de Fibonacci, les tours de Hanoï, les fractales… La définition même du problème est récursive.
  • Clarté du code : Pour certains problèmes, la solution récursive est plus courte et plus lisible que la solution itérative (avec des boucles).

Quand il faut être prudent ⚠️:

  • Profondeur de récursion : Chaque appel récursif ajoute une « couche » sur la pile. Si la récursion est trop profonde (beaucoup d’appels successifs), vous risquez le RecursionError. Python a une limite par défaut (souvent autour de 1000 appels).
  • Performance : Les appels de fonctions ont un coût. Parfois, une solution itérative est plus rapide et utilise moins de mémoire. La suite de Fibonacci est un bon exemple : la version récursive est très lente pour de grands nombres car elle recalcule les mêmes valeurs plusieurs fois.

fin du cours

Défi 1 : Le Compteur d’Étoiles Filantes 🌠

Imaginez que l’on décide de regarder les étoiles filante chaque nuit à partir d’une première nuit . chaque nuit, le nombre d’étoiles filantes que vous voyez est exactement égal au numéro du jour, autrement dit la cinquième nuit on verra 5 étoiles filantes.

Exercice : Créez une fonction récursive nommée compte_etoiles_filantes(jour) qui calcule le nombre cumulé d’étoiles filantes observées jusqu’à un certain jour. Par définition, au jour 1, vous avez vu 1 étoile filante. Pour tout jour n > 1, le nombre d’étoiles est n s’ajoute au nombre d’étoiles des jour n-1 jusqu’à 1.

Prérequis : Maîtrise des concepts de base des fonctions (définition, appel, return).

Analyse du problème : La définition nous est donnée :

  • Cas de base : compte_etoiles_filantes(1) doit retourner 1.
  • Cas récursif : compte_etoiles_filantes(n) doit retourner n + compte_etoiles_filantes(n-1).


# Tests rapides :
print(f"Étoiles au jour 1 : {compte_etoiles_filantes(2)}")  # Attendu : 3 (2 + 1)
print(f"Étoiles au jour 3 : {compte_etoiles_filantes(3)}")  # Attendu : 6 (3 + 2 + 1)
print(f"Étoiles au jour 5 : {compte_etoiles_filantes(5)}")  # Attendu : 15 (5 + 4 + 3 + 2 + 1 )

correction


Défi 2 : La Danse des insectes de Syracuse 🐜

Imaginez un insecte magicien. Chaque jour, si son nombre de pattes est pair, il en perd la moitié. Si son nombre de pattes est impair, son nombre de pattes triple et gagne une patte supplémentaire en prime. La légende dit que toutes les fourmis finissent toujours par n’avoir qu’une seule patte.

Exercice : Écrivez une fonction récursive danse_syracuse(nombre_pattes) qui prend en paramètre le nombre de pattes initial de l’insecte et affiche la séquence des nombres de pattes jour après jour, jusqu’à ce que l’insecte n’en ait plus qu’une. On supposera nombre_pattes est un entier positif strictement supérieur à 1.

Prérequis : Maîtrise des opérateurs modulo (%) et division entière (//). Comprendre l’importance du cas de base pour éviter la récursion infinie.

Analyse du problème : La suite de Syracuse est définie par deux règles :

  • Si u_n est pair : u_{n+1} = u_n / 2
  • Si u_n est impair : u_{n+1} = 3 * u_n + 1 Le cas de base est lorsque u_n atteint 1.

correction


Défi 3 : La Mélodie des Nombres Étranges 🎶

Imaginez une suite où chaque valeur dépend des deux valeurs précédentes et d’une constante. La première valeur est notée ‘A’ et la deuxième note est notée ‘B’. Ensuite, chaque nouvelle note est calculée en combinant trois fois la note précédente, deux fois celle d’avant et en ajoutant cinq .

Exercice : Écrivez une fonction récursive suite_etrange(n, note_A, note_B) qui renvoie la valeur de la n-ième note de cette suite, en considérant que n=0 correspond à note_A et n=1 à note_B.

Prérequis : Compréhension des suites définies par récurrence sur plusieurs termes précédents.

Analyse du problème : La suite est définie par :

  • u_0 = a
  • u_1 = b
  • u_n = 3 * u_{n-1} + 2 * u_{n-2} + 5 pour n >= 2

Les cas de base sont n=0 et n=1. Pour les autres n, c’est un appel récursif.

# Tests rapides :
print(f"Mélodie à l'indice 0 (A=10, B=20): {melodie_etrange(0, 10, 20)}") # Attendu : 10
print(f"Mélodie à l'indice 1 (A=10, B=20): {melodie_etrange(1, 10, 20)}") # Attendu : 20
print(f"Mélodie à l'indice 2 (A=10, B=20): {melodie_etrange(2, 10, 20)}") # Attendu : 3*20 + 2*10 + 5 = 85
print(f"Mélodie à l'indice 3 (A=10, B=20): {melodie_etrange(3, 10, 20)}") # Attendu : 3*85 + 2*20 + 5 = 300

correction


Défi 4 : Le Labyrinthe des Chiffres Croissants 🔢➡️🔢

Imaginez que vous êtes dans un labyrinthe où chaque pièce est un chiffre. Vous ne pouvez avancer que vers des pièces avec un chiffre plus élevé, et vous voulez visiter toutes les pièces entre un point de départ et un point d’arrivée.

Exercice : Créez une fonction récursive explore_labyrinthe(depart, arrivee) qui affiche tous les entiers de depart à arrivee (inclus), dans l’ordre croissant.

Prérequis : Maîtrise des opérateurs de comparaison et des structures conditionnelles (if).

Analyse du problème : Le cas de base est lorsque depart dépasse arrivee. Sinon, on affiche depart et on explore le reste du labyrinthe en augmentant depart.

# Tests rapides :
print("Exploration de 0 à 3 :")
explore_labyrinthe(0, 3) # Attendu : 0 1 2 3
print("\nExploration de 5 à 5 :")
explore_labyrinthe(5, 5) # Attendu : 5
print("\nExploration de 7 à 4 :")
explore_labyrinthe(7, 4) # Attendu : rien (condition depart > arrivee est vraie immédiatement)

correction


Défi 5 : Le Décodeur de Clés Secrètes (PGCD) 🔑

Pour déverrouiller une porte secrète, vous avez besoin du plus grand commun diviseur (PGCD) de deux nombres. La machine utilise un algorithme où si le deuxième nombre est zéro, le PGCD est le premier nombre. Sinon, le PGCD est celui du deuxième nombre et du reste de la division du premier par le deuxième.

Exercice : Écrivez une fonction récursive decode_cle_secrete(a, b) qui renvoie le PGCD de deux entiers positifs a et b, en utilisant l’algorithme d’Euclide.

Prérequis : Connaissance de l’algorithme d’Euclide pour le PGCD, et de l’opérateur modulo (%).

Analyse du problème : L’algorithme d’Euclide est intrinsèquement récursif : on fait des divisions euclidiennes successives et à chaque fois le diviseur devient le nouveau dividende et le reste devient le nouveau diviseur. Du coup le PGCD de la paire de base a la même valeur que la paire suivante, qui aura la même valeur que … De plus on est censé s’arrêter et prendre le dernier reste non nul. Vérifier que tout ça peut être traduit de la manière suivante :

  • Cas de base : Si b est 0, le PGCD est a.
  • Cas récursif : Sinon, PGCD(a, b) = PGCD(b, a % b).
# Tests rapides :
print(f"PGCD(48, 18) : {decode_cle_secrete(48, 18)}") # Attendu : 6
print(f"PGCD(17, 5) : {decode_cle_secrete(17, 5)}")   # Attendu : 1
print(f"PGCD(100, 25) : {decode_cle_secrete(100, 25)}") # Attendu : 25
print(f"PGCD(7, 0) : {decode_cle_secrete(7, 0)}")     # Attendu : 7

correction


Défi 6 : L’Inspecteur de Chiffres 🕵️‍♀️

Vous êtes un inspecteur et vous devez compter le nombre de chiffres qui composent un suspect numérique. Chaque fois que vous examinez un chiffre, vous retirez ce chiffre et comptez le reste. Par exemple si vous inspectez 179, vous allez prendre 9, et il restera 17, puis vous prendrez 7, il restera 1, vous le prenez il ne reste rien. Vous avez pris successivement trois chiffres avant de ne rien avoir à prendre donc, la réponse vous allez rendre/afficher est 3. Ça à l’air simple comme ça, mais passer de 179 à 17 puis à 1 et enfin à rien, ça va vous demander un peu de réflexion.

Exercice : Écrivez une fonction récursive inspecteur_de_chiffres(n) qui prend un entier positif ou nul n et renvoie son nombre de chiffres décimaux.

Prérequis : Maîtrise des opérateurs de division entière (//). Gérer le cas n=0 correctement.

Analyse du problème :

  • Le nombre de chiffres d’un nombre entre 0 et 9 est 1. C’est notre cas de base.
  • Pour un nombre n plus grand, le nombre de chiffres est 1 (pour le chiffre des unités) plus le nombre de chiffres de n // 10.
# Tests rapides :
print(f"Chiffres de 0 : {inspecteur_de_chiffres(0)}")      # Attendu : 1
print(f"Chiffres de 7 : {inspecteur_de_chiffres(7)}")      # Attendu : 1
print(f"Chiffres de 42 : {inspecteur_de_chiffres(42)}")     # Attendu : 2
print(f"Chiffres de 12345 : {inspecteur_de_chiffres(12345)}") # Attendu : 5

correction


Défi 7 : Le Compteur de Bits Lumineux 💡

Dans le monde binaire, certains bits sont « lumineux » (valent 1) et d’autres sont « éteints » (valent 0). Vous devez compter combien de bits lumineux il y a dans la représentation binaire d’un nombre.

Exercice : Écrivez une fonction récursive compteur_bits_lumineux(n) qui prend un entier positif ou nul n et renvoie le nombre de bits valant 1 dans sa représentation binaire.

Prérequis : Connaissance des opérateurs binaires (% 2 pour le dernier bit, // 2 pour décaler à droite).

Analyse du problème :

  • Le cas de base est lorsque n est 0, il n’y a aucun bit 1.
  • Pour n > 0, on vérifie le dernier bit (n % 2). S’il vaut 1, on l’ajoute au compte. Ensuite, on compte les bits 1 dans le reste du nombre (n // 2).
# Tests rapides :
print(f"Bits lumineux de 0 (0b0) : {compteur_bits_lumineux(0)}")      # Attendu : 0
print(f"Bits lumineux de 1 (0b1) : {compteur_bits_lumineux(1)}")      # Attendu : 1
print(f"Bits lumineux de 2 (0b10) : {compteur_bits_lumineux(2)}")     # Attendu : 1
print(f"Bits lumineux de 3 (0b11) : {compteur_bits_lumineux(3)}")     # Attendu : 2
print(f"Bits lumineux de 255 (0b11111111) : {compteur_bits_lumineux(255)}") # Attendu : 8
print(f"Bits lumineux de 10 (0b1010) : {compteur_bits_lumineux(10)}")    # Attendu : 2

correction


Défi 8 : Le Détecteur d’Intrusions dans le Tableau 🚨

Vous êtes le gardien d’un tableau de valeurs et vous devez vérifier si une valeur spécifique est présente à partir d’un certain point.

Exercice : Écrivez une fonction récursive detecteur_intrusions(valeur, tableau, indice_depart) qui renvoie True si valeur apparaît dans tableau à partir de indice_depart (inclus) jusqu’à la fin du tableau, et False sinon. On garantit que indice_depart est toujours un indice valide.

Prérequis : Maîtrise des listes/tableaux (accès par indice, len()), des opérateurs de comparaison et des booléens.

Analyse du problème :

  • Cas de base 1 : Si indice_depart atteint la fin du tableau (len(tableau)), cela signifie que la valeur n’a pas été trouvée, donc on retourne False.
  • Cas de base 2 : Si la valeur à tableau[indice_depart] correspond à valeur, on a trouvé, on retourne True.
  • Cas récursif : Sinon, on continue la recherche à l’indice suivant (indice_depart + 1).
# Tests rapides :
mon_tableau = [10, 20, 30, 40, 50]
print(f"20 dans [10, 20, 30, 40, 50] à partir de 0 : {detecteur_intrusions(20, mon_tableau, 0)}") # Attendu : True
print(f"60 dans [10, 20, 30, 40, 50] à partir de 0 : {detecteur_intrusions(60, mon_tableau, 0)}") # Attendu : False
print(f"40 dans [10, 20, 30, 40, 50] à partir de 3 : {detecteur_intrusions(40, mon_tableau, 3)}") # Attendu : True
print(f"10 dans [10, 20, 30, 40, 50] à partir de 1 : {detecteur_intrusions(10, mon_tableau, 1)}") # Attendu : False
print(f"50 dans [10, 20, 30, 40, 50] à partir de 4 : {detecteur_intrusions(50, mon_tableau, 4)}") # Attendu : True

correction


Défi 9 : Le Secret du Triangle Magique de Pascal 🧙‍♂️

Le triangle de Pascal est un artefact mathématique où chaque nombre est la somme des deux nombres directement au-dessus de lui. Les bords du triangle sont toujours des 1.

Exercice :

  1. Écrivez une fonction récursive coefficient_magique(n, p) qui renvoie la valeur du coefficient binomial C(n,p) (le nombre à la ligne n et à la position p dans le triangle de Pascal), en utilisant la définition récursive donnée :
    • C(n,p)=1 si p=0 ou n=p
    • C(n,p)=C(n−1,p−1)+C(n−1,p) sinon.
  2. Utilisez une double boucle for pour afficher les 11 premières lignes (de n=0 à n=10) du triangle de Pascal, en utilisant votre fonction.

Prérequis : Maîtrise des boucles for imbriquées et de l’affichage formaté (print). Comprendre la définition mathématique récursive.

Analyse du problème : La définition récursive est très claire :

  • Cas de base 1 : p = 0, le coefficient est 1.
  • Cas de base 2 : n = p, le coefficient est 1.
  • Cas récursif : C(n-1, p-1) + C(n-1, p).
# Tests rapides de la fonction :
print(f"C(0, 0) : {coefficient_magique(0, 0)}")  # Attendu : 1
print(f"C(3, 1) : {coefficient_magique(3, 1)}")  # Attendu : 3
print(f"C(4, 2) : {coefficient_magique(4, 2)}")  # Attendu : 6

correction

Défi 10 : Retour sur les autres fractales

Faites une petite recherche sur les fractales de Sierpinsky.

Est ce que l’image fournie par l’IA est réaliste ? Etudier d’un peu plus près la logique derrière les deux fractales.

Exercice :

Créer deux programmes pour les deux versions de la fractale

Analyse du problème et conseils : on peut créer une fonction dessinant le motif de base : un triangle équilatéral / rectangle.

les coordonnées d’un triangle équilatéral de côté l et dont le premier sommet a pour coordonnées (0,0) seront (0,0) , (l,0) et (l/2,racine(3)/2).

pour le triangle de Sierpinski voici un début de programme :

from turtle import *
from math import sqrt

speed(0) # Vitesse maximale pour un dessin rapide

def triangle(x:int,y:int,l:int,c:str):
    """dessine un triangle équilatéral de dimension l et de couleur c
    il aura une base horizontale et la pointe vers le haut"""
    penup()
    goto(x,y) # Position de départ pour le rectangle
    pendown()
    fillcolor(c)
    begin_fill()
                                     #dessiner le triangle orienté vers le haut
    end_fill()

def SierTri(x,y,l,c1,c2,n):
    """dessine le triangle de Sierpinski de dimension l à l'ordre n,
    son premier sommet a pour coordonnées (x,y), c1 est la couleur majoritaire
    c2 est celle des incrustations"""
    if n==0 :
        triangle(x,y,l,c1)
    else :
        triangle(x,y,l,c2) #l'incrustation apparaitra par transparence
        # faire trois appels au rang n-1 , avec une dimension diminuée et commençant au bon endroit

def SierCent(l,c1,c2,n) : #petit bonus pour faire partir la figure à partir d'un point optimal
    SierTri(-l/2,-sqrt(3)*l/4,l,c1,c2,n)

SierCent(200,"blue","red",4)
done() # Garde la fenêtre ouverte

  • Pour le tapis, un peu moins d’aide est nécessaire,
from turtle import *

speed(0) # Vitesse maximale pour un dessin rapide

def rectangle(x,y,h,l,c):


def Sierpinsky(x,y,h,l,c1,c2,n):
    if n==0 :
        
    else :
        #faire 8 appels de la fonction Sierpinski au rang n-1 et un rectangle de couleur c2
        Sierpinsky(x,y,h/3,l/3,c1,c2,n-1)
        ...

Sierpinsky(-200,200,400,400,"blue","red",4)
done() # Garde la fenêtre ouverte

🎲 Le Maître des Permutations 🤹‍♂️ un défis qui vous mettra à rude épreuve

Un problème classique et élégant à résoudre avec la récursivité est de générer toutes les permutations d’une liste (toutes les façons d’ordonner ses éléments).

Par exemple, pour [1, 2, 3], les permutations sont [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1].

Comment ça marche pour trouver les permutation des éléments d’une liste. On peut visualiser ça avec un arbre de combinaisons (même principe qu’un arbre de probabilités)

  1. On choisit un élément de la liste.
  2. On identifie ce qui reste d’éléments à traiter
  3. Et après cet élément on aura toutes les permutations des éléments restants. On lance un appel de notre fonction récursive pour générer une liste des permutations de ce qui reste d’éléments à traiter (autrement dit on crée un liste des permutations des éléments restants) cet appel peut en provoquer un autre qui en provoque un autre…jusqu’à ce que le reste ne contienne qu’un élément et dans ce cas la liste renvoyée est très courte, elle ne contient qu’un élément le fameux élément restant.
  4. On combine l’élément choisi avec toutes les permutations du reste.
  5. retour au 1. jusqu’à ce qu’on finisse de couvrir les éléments de la liste

Les Arrangements de Mots ✍️

En vous inspirant de ce qui précède, essayez de compléter cette fonction pour qu’elle affiche toutes les permutations d’une chaîne de caractères (par exemple, « ABC »).

def permuter(chaine):
    if                   : #condition d'arrêt
        return [chaine]
    
    permutations = []
    for i, char in enumerate(chaine): #pour chaque caractère choisi on a une double info : son rang et le caractère lui même
        reste =                       # Le reste de la chaîne , il faudra se rappeler comment prendre des morceaux 
                                      #d'une chaine et les concaténer
                                                          
        # On permute le reste
        permutations_restantes = permuter(reste)
        
        # On combine le caractère choisi avec les permutations du reste
        for p_reste in permutations_restantes:
                                                   #on rajoute à notre liste "permutations" une chaine 
                                                   #formée de la lettre choisie et de la combinaison du moment
            
    return permutations  #on renvoie une liste de permutation des éléments restants passés en paramètre dans "permuter"

print(permuter("ABC"))

correction

C’est un peu plus complexe, mais ça montre bien la puissance de la récursivité pour découper un gros problème en petits morceaux !

💡 Un petit défi pour la route : Les Tours de Hanoï 🗼

Les Tours de Hanoï sont un puzzle classique parfait pour la récursivité. Vous avez 3 piquets et des disques de tailles différentes. Le but est de déplacer tous les disques d’un piquet de départ à un piquet d’arrivée, en ne déplaçant qu’un seul disque à la fois, et en ne posant jamais un grand disque sur un petit.

Le Déplaceur de Disques 💿

Recherchez les « Tours de Hanoï algorithme récursif » et essayez d’implémenter une fonction Python qui affiche les étapes pour déplacer les disques.

correction



Alors, ces défis vous ont-ils fait voir la récursivité sous un nouveau jour ? La récursivité est un outil puissant et élégant quand il est bien utilisé. N’hésitez pas à rejouer ces défis avec différentes valeurs pour bien comprendre comment la pile d’exécution travaille ! Quelle est votre fractale préférée à part celle de Koch ?

Terminale option maths complémentaires (2024)

Lors du premier cours merci de remplir le questionnaire suivant.

règles et conseils

pour les problèmes d’emploi du temps, la direction essaye de faire en sorte que les élèves puissent faire deux options mais ça n’a pas été sans générer quelques petits couacs. Actuellement l’heure du vendredi de 16h à 17h a disparu de l’emploi du temps d’une partie des élèves. Certains ont rencontré Mme Durand (une des deux adjointes) et ont déjà réglé le problème, pour les 9 restants (essentiellement en TG6) ça devrait se régler tout seul sauf pour deux qui devront échanger avec moi vendredi à 17h pour voir comment gérer l’heure commune CAV/Maths Comp. Si vendredi ça n’est pas encore réglé, venez en classe à 16h comme initialement prévu et je verrai avec Mme Durand.

Option Mathématiques complémentaires

L’essentiel des documents accessibles sur cette page ont été produits par Pascal Brachet, professeur de mathématiques.

«L’enseignement optionnel de mathématiques complémentaires est destiné prioritairement aux élèves qui, ayant suivi l’enseignement de spécialité de mathématiques en classe de première et ne souhaitant pas poursuivre cet enseignement en classe terminale, ont cependant besoin de compléter leurs connaissances et compétences mathématiques par un enseignement adapté à leur poursuite d’études dans l’enseignement supérieur, en particulier en médecine, économie ou sciences sociales.
Le programme de mathématiques complémentaires s’appuie sur le programme de spécialité de mathématiques de la classe de première qu’il réinvestit et enrichit de nouvelles connaissances et compétences mathématiques… »

1. Lois de probabilités discrètes

2. Limites de fonctions

3. Dérivation, continuité et convexité

4. Complément sur la fonction exponentielle – Fonction logarithme népérien

5. Statistique à deux variables

6. Primitives et intégration

7. Lois de probabilités continues

8. Complément sur les suites

9. Équations différentielles

1ère Spécialité Mathématiques (2024)

Pour réussir sa rentrée en classe de première (cahier de vacances)

Lors du premier cours merci de remplir le questionnaire suivant.

règlement classe

En juin 2026 aura lieu la première épreuve anticipée de mathématiques à destination des élèves de 1ère. Pour vous faire une idée de la structure de cette épreuve je vous invite à regarder le sujet O proposé aux professeurs de mathématiques pour leur permettre de guider leurs élèves dans la préparation de l’épreuve à venir.

Chapitre 1 : Polynômes du second degré

Chapitre 2 : Suites numériques (généralités)

Chapitre 3 : Dérivation 1/2 (bases)

Chapitre 4 : indépendances et probabilités conditionnelles. 

Chapitre 5 : Dérivation 2/2 (fonction dérivée, variations)

Chapitre 6 : Suites numériques (cas des suites géométriques et arithmétiques)

Chapitre 7  : Fonctions trigonométriques

Chapitre 8 : Fonction exponentielle 

Chapitre 9  : Produits scalaires  

Chapitre 10  : Probabilités et variables aléatoires  

Chapitre 11  : Géométrie dans le plan

Bon site pour travailler en autonomie : Logamaths.fr 

Pour réussir sa rentrée en classe de terminale (cahier de vacances)

2nde Maths (2024)

pour préparer une rentrée réussie en seconde (à l’attention des élèves qui n’ont pas encore fait leur rentrée)

Lors du premier cours merci de remplir le questionnaire suivant.

Version numérique du règlement et conseils distribué durant le premier cours.

fournitures :

  • plusieurs cahiers petit ou grand format suivant vos préférences ou un classeur grand format.  
  • tube de colle.
  • Il y aura quelques chapitres de géométrie, pour ces cours : règle, équerre, compas  
  • calculatrice :
    • recommandée : Numworks (émulateur) achat groupé avec le lycée ICI.
    • acceptée : TEXAS INSTRUMENTS TI-82 Advanced Edition Python (émulateur)

Polycopiés de cours de mathématiques 

Les cours et une partie des activités de l’année seront la plupart du temps tirés du site d’Yvan Monka « Maths et tiques » pour obtenir les versions modifiables et les liens vers les vidéos explicatives pour bien réviser je vous encourage à aller consulter ses pages 2nde. Plus bas vous trouverez les autres documents : fiches de synthèses, contrôles et devoir maison, exercices.

chapitre 0 : les bases d’un travail sérieux

chapitre 1 : repérage  

chapitre 2 : les multiples

chapitre 3 : les nombres réels (racines),

chapitre 4 : vecteurs (hors repère)

chapitre 5 : calculs littéraux

chapitre 6 : fractions 

chapitre 7 : vecteurs dans un repère

chapitre 8 : équations et Thalès

chapitre 9 : généralités sur les fonctions

chapitre 10 : variations de fonctions & parité

chapitre 11 : intervalles inéquations (à redéplacer avant le chapitre 10)

chapitre 12 : droites du plan 

chapitre 13 : parité d’un entier

chapitre 14 : statistiques

chapitre 15 : systèmes

chapitre 16 : pourcentages

chapitre 17 : probabilités

chapitre 18: échantillonnage

Pour réussir sa rentrée en classe de première (cahier de vacances)

La démonstration : mode d’emploi

I – Aborder l’étude d’une situation.

1)      faire une lecture globale de l’énoncé (jusqu’à la 1ère question)

2)      dégager les données du problème (souligné en vert) et la conclusion (souligné en rouge) [ou les réécrire].

3)      éventuellement, reformuler certaines données (ex : B est le symétrique de A par rapport au point O signifie que O est le milieu de [AB])

4)      construire une figure claire et bien codée sur une feuille séparée (éviter les cas particuliers, utiliser des couleurs : porter les données en vert, …)

5)      déterminer la nature du travail à exécuter :

                        représenter, tracer, construire, expérimenter, conjecturer, déterminer,

                        Vérifier, démontrer (montrer), prouver, calculer, comparer, résoudre. 

II – Elaborer une solution

1)      se référer à une situation semblable (déjà rencontrée)

2)      se référer au cours (en relation avec les point importants des données et de la conclusion)

3)      faire un choix des méthodes et des outils qui permettent de traiter le problème. 

III – rédiger la solution en tenant compte des remarques ci-dessous

1)      faire des phrases avec un sujet, un verbe etc. …, sans faute d’orthographe.

2)      Ne pas utiliser d’abréviation.

3)      Décomposer vos réponses en paragraphes suivant une des méthodes qui suit :

Méthode 1

« comme, (puisque, je sais que, …) »  on cite l’argument, (la donnée, l’hypothèse)

« or,( il se trouve , on sait que, et) »  on cite le théorème, (la propriété, la définition) sur lequel on s’appuie

« donc, alors par conséquent , on en déduit que » on donne la conclusion                        

Exemple : Je sais que ABCD est un parallélogramme, or un parallélogramme a ses coté opposés de même longueur donc AB = CD

ABCD est un parallélogramme, et on sait qu’un parallélogramme a ses cotés opposés de même longueur, on peut donc conclure que AB = CD

Méthode 2

On écrit notre argument, « donc », on écrit la conclusion, et entre parenthèse on indique le nom, ou le numéro du théorème utilisé.

A la fin de notre rédaction, on doit donner l’énoncé de chacun des théorèmes utilisésExempleABCD est un parallélogramme, donc AB = CD  (théorème 1)Théorème 1 : un parallélogramme a ses cotés opposés de même longueur. 

Remarque :

Cette méthode est souvent très avantageuse car on peut utiliser plusieurs fois le même théorème dans une démonstration

Année 2016-17

Terminale ES

cours sur les révisions sur les dérivées : ici  

cours suites : ici

fiche de révision sur les suites : ici 

correction du DM 3 (facultatif) : ici 

fiche d’entrainement pour préparer le DS (elle contient la correction du DM2)  : ici 

contrôle des STL sur le même sujet et avec beaucoup d’exigences communes : ici

Devoir maison Toussaint : ici

cours fonctions : ici

fiche de révision : corollaire du TVI ici

fiche de révision : convexité ici

interrogation corollaire du TVI ici

programme Delta : ici

exponentielles et logarithme

cours ici et  ici

fiche de révision ici 

ISN Terminale 

un lien pour vous aider à créer votre propre environnement Python portable : ici 

de très bonnes vidéos pour découvrir python : ici 

séance 2

approfondissement des fonctions

conversion binaire <-> décimal

librairies

opérateurs % et //

types de variable , conversion avec les fonctions int() et str() 

travail à envoyer par mail avant le 20/09/2016 : faire un joli dessin avec le module turtle, en utilisant des boucles et des fonctions. 

séance 7 

correction des exercices (fin de première séquence)  ici

fable de la fontaine ici

fiche cryptographie (version docx : ici)  (version pdf ici)

séance 8 

 exercices du jour   ici 

séance 9

on continue avec les consignes de la semaine 8

exemple de codage amusants : dyslexie Stylisé 

résumé externe du cours : ici 

séance 10

exercices du jour   ici 

diaporama sur la programmation orientée objet    ici  exemple du diaporama ici

cours détaillé sur la programmation orienté objet (par Gérard Swinnen) ici

bonus : un autre cours détaillé ici 

  

séance 11

détail de la séance à la fin du fichier de suivi ici  

programmation objet :

correction de l’exercice sur les vecteurs ici 

exemple puis exercices 3 et 4 à la fin de la page ici

codage / décodage :

programme pour écrire de manière stylisée ici 

séance 12 

correction du programme : classe jeu_de_carte ici 

on va prendre une variante de la solution proposée par le site ( ici il y avait un lien évident qui offrait la majeure partie de la solution, le reste était sur pronote)

évaluation : création d’un programme contenant la création d’une classe et utilisant du stockage externe de donnée

détails :  ici

pour vous guider voici un programme à compléter ici  ainsi qu’un exemple de sauvegarde  ici

Devoir maison pendant les vacances du nouvel an : les programmes de cryptages annoncés durant toutes les séances. Vous pourrez poser vos questions par mail puis envoyer votre devoir (format numérique obligatoire, word préféré, open office accepté) à jkergot@yahoo.fr  

Non fait = -2 à la moyenne , fait , et même si c’est tout faut c’est au moins +1 à la moyenne, au mieux +2 

séance 13

avec M. Espinosa : découverte d’arduino et de sonic pi

séance 14

préparation  :

télécharger processing ici et le décompresser sur votre ordinateur ou sur votre clé USB (il vous faudra séléctionner la version 32bits ) 

télécharger la documentation en français ici 

déroulement 

correction de l’activité de programmation orienté objet d’avant les vacances 

présentation de processing, un langage de programmation idéal pour les travaux graphiques 

pour la prochaine séance :

ramener la fiche polycopiée (distribuée lors de la seconde séance avec les commandes la synthaxe et les exemples)

remplir le questionnaire anonyme de qualité ici  

séance 16

retour sur processing : classe, interraction avec l’utilisateur, animation 

quelques exemples de programmes ici et ici

compression avec ou sans perte 

pour préparer la séance suivantes , voici le travail à faire pendant les vacances :

remplir le questionnaire pour ceux qui ne l’ont pas encore fait,

prolonger le programme de la séance 16

ou faire un exposé (la liste des exposés ici et le mini jeux proposé durant la séance 16 ici ) 

Séance 18

pour la préparer (voir plus haut)

projets

deux exposés tirés des travaux à faire pendant les vacances 

séance 19 

un guide pour le projet ici

un exemple de dossier 

la grille d’évaluation pour le bac : ici 

TSTL

DM facultatif limites et suites (Toussaint)  ici

cours sur les primitives avec des tableaux vides grand format à compléter ici

contrôle corrigé sur les primitives et les limites  ici

fiche de révision logarithmes et exponentielles ici 

Année 2019-20

Continuité pédagogique (durant la période de confinement)

présentation de la continuité pédagogique

cours en direct :  la salle de classe virtuelle est ici

calendrier des cours en direct :

Jeudi 11 juin 

vendredi 12 juin :  

  • 11h-12h Python (découverte heure 1)
  • 14h-15h HTML / CSS heure 1

lundi 15 juin :  

  • 9h00 10h00 conseil de classe des TES1
  • 11h00-12h00 HTML / CSS / JavaScript heure 5
  • 14h00-15h00 bases Excel / OpenCalc ou python + stats

mardi 16 juin 

  • 11h-12h Python heure 2 (travail sur le texte)

mercredi 17 juin 

  • 10h-11h HTML / CSS heure 2
  • 11h-12h HTML / CSS / JavaScript heure 6

Jeudi 18 juin 

  • 11h-12h HTML / CSS / JavaScript heure 7

vendredi 19 juin :  

  • 11h-12h Python (découverte heure 3)
  • 14h-15h HTML / CSS heure 3

lundi 22 juin :  

  • 11h00-12h00 HTML / CSS / JavaScript heure 8
  • 14h00-15h00 JavaScript P5 heure 2

mardi 23 juin 

  • 11h-12h Python heure 3 (travail sur le texte)

mercredi 24 juin 

  • 10h-11h JavaScript pur heure 9
  • 11h-12h JavaScript P5 heure 3

C’est la fin… alors on va faire un peu d’informatique 

HTML / CSS  pdf  (nouveau) 

bases Python et JavaScript ici (approche comparative)  (nouveau) 

Classes de seconde

document d’accompagnement pour travailler seul à la maison (découpage de la séquence)

semaines 1&2 pdf / docx 3&4 pdf / docx  4&5 pdf / docx  6 à 9 pdf / docx  (nouveau)

documents annexes : 

cours généralités fonctionsfiche exercices fonctions, devoir maison 1 pdf / docx

cours informations chiffrées,  cours fonctions de référence,  cours statistiques,  cours probabilités  (nouveau), 

devoir maison 2 pdf ,  cours variations fonctions

devoir maison 3 pdf 

devoir maison 4 pdf (nouveau)  

Classe de terminale ES  

document d’accompagnement pour travailler seul à la maison (découpage de la séquence)

semaines 1&2  pdf / docx    semaines 3&4  pdf / docx   semaines 4&5  pdf / docx (mis à jour)

documents annexes  cours lois à densité   cours estimation (nouveau)

Bac blanc  pdf / docx & correction pdf / docx

devoir maison estimation   pdf / docx

spé math ES

document d’accompagnement pour travailler seul à la maison   pdf  / docx (mis à jour)

documents annexes    : cours graphes partie 2 , fiche d’exercices sur la coloration (entre autre) (nouveau)

supplément au cours : coloration de graphe 

graphes et réseaux sociaux 

Questionnaire personnel

je suis en cours de maths : 2nde / Terminale 

je suis en cours d’informatique : 2nde / Terminale 

Communication libre ici 

Maths 2nde

fiche fractions (avec son corrigé)

fiche d’exercices factorisation développement (avec son corrigé)

fiche d’exercices équation et inéquation 2 (avec son corrigé)

cours complet sur les équations et inéquations 

fiche d’exercices racines (avec corrigé)

contrôle 1 des 2nde10

j’ai trouvé un site bourré de fiches d’exercices parfaites pour réviser les notions de collège  

fiche d’exercices vecteurs 

fiche d’exercices bonus vecteurs 

contrôle corrigée vecteurs  

invitation pour la classe virtuelle pour travailler sur python séance 1,2&3 (nouveau)

fiche méthode (corrigée) inéquation produit / racines   

fiche d’exercices super complète  vecteurs  (corrigée

sujet DM pour le 5 décembre 2019 

corrigés d’exercices du livre  arithmétique  

corrigés de l’interrogation d’arithmétique    

interrogation vecteurs et repérage     

sujet DM pour le 25 janvier 2020  (vous pouvez aller dans la salle de classe virtuelle et chercher le projet nommé « devoir maison : repérage » et compléter le code)

interrogation équations de droite    rattrapage équations de droite + Thalès   (nouveau)    

méthodes équations de droite   (nouveau)   

système équations   (nouveau)

SNT

HTML 

cours 

exemple de pages HTML à décortiquer

fichier word à « convertir en HTML » 

liste des balises HTML version 1version 2 , version 3 

rendre son devoir ici 

Python 

lien pour s’enrôler dans la classe virtuelle repl.it 

diaporama sur la découverte du langage Python

troncature encadrement  (nouveau)  

traitement des images 

turtle : 

TES

fiche méthode : étude du signe d’une expression

exemples de dérivées (dernière mise à jour 10/09/2019) 

A titre d’information voici ce qui a été fait par vos camarades durant les premiers mois 

Sujets sur les dérivées    (correction)

Sujets sur les dérivées n°2    (correction

suites : réviser avec des vidéos partie 1 et partie 2 

exercices de révision suites 

devoir maison suites (révisions) 

interrogation annulée  

cours suites  

DM (2018)   

contrôle 2017   

préparation au contrôle 2019 

séance du 11 octobre

création d’une fiche méthode / fiche méthode terminée 

pour réviser les puissances aller sur ce site et faire les quatre fiches corrigées sur les puissances 

 fiche préparation au contrôle fonctions

vidéo sur le corollaire du TVI (attention le professeur ne fait pas la distinction entre le corollaire et le TVI lui même au moment de conclure) 

correction(partielle du DS sur les fonctions)     

correction d’exercices sur l’exponentielle      (nouveau) 

correction DS/DM exponentielle      (nouveau)  

Méthodologie 

fiche : comment réussir au lycée    (nouveau)

fiche : comment faire une fiche méthode   

fiche : travail maison en maths  

fiche : cartes mentales   

fiche : créer une nouvelle habitude    

ISN

travail maison : initiation aux langages HTML et CSS : ici 

découverte de l’éditeur Sublime Text (à télécharger ici)

base de javascript (document d’accompagnement possible  ici  version résumée ici)

quelques exemples pour démarrer : présenté au tableau , avec des formulaires et un template   

fiche d’exercices (correction d’une partie des exercices)  

devoir maison pour le 18 octobre 2019 

liste des exposés(phase 1 : faire la recherche et présenter l’ensemble dans un fichier word ou open office avec un répéretoire dédié aux pièces annexes. Phase 2 : avec sublime text créer une page web présentant votre exposé) n

librairie P5  exemple 0exemple 1, (source des exemples), cours P5.js ici , cours P5.play.js ici

exercices P5 & P5 play (avec correction intégrale version 26 nov)    (nouveau)

évaluation P5    (nouveau) mod

cours et documents sur le DOM   ici

2021 1STL

mise à jour des TI83

  • calculatrice avec Python (installer le logiciel de communication ordi-calculatrice, puis y adjoindre la mise à jour ici, puis connecter l’ordinateur et la calculatrice, lancer le logiciel de communication, puis choisir dans le menu action : envoyer os/bundle) 
  • TI83 sans python(installer le logiciel de communication ordi-calculatrice, puis télécharger le bundle de m mise à jour ici , ensuite connecter l’ordinateur et la calculatrice, lancer le logiciel de communication, puis choisir dans le menu action : envoyer os/bundle) (il faudra récupérer le module additionnel à connecter à la calculatrice pour pouvoir utiliser python )

Chapitres

2023 Mathématiques 1G

Chapitre 1 : Polynômes du second degré

Chapitre 2 : Suites numériques (généralités)

Chapitre 3 : Dérivation 1/2 (bases)

Chapitre 4 : indépendances et probabilités conditionnelles. 

Chapitre 5 : Dérivation 2/2 (fonction dérivée, variations)

Chapitre 6 : Suites numériques (cas des suites géométriques et arithmétiques)

Chapitre 7  : Fonctions trigonométriques

Chapitre 8  : Produits scalaires  

Chapitre 9  : Probabilités et variables aléatoires  

  • cours à compléter (pour la version complète, vous pouvez aller sur le site de M. Monka)
  • exercices fiche 1 (corrections),  fiche 2(corrigé inclus), fiche 3 (fiche très complète portant sur les deux chapitres)

Chapitre 10 : Fonction exponentielle 

Chapitre 11  : Géométrie dans le plan

Bon site pour travailler en autonomie : Logamaths.fr