Programme officiel

Contenus Capacités attendues Commentaires
Récursivité Écrire un programme récursif.
Analyser le fonctionnement d’un programme récursif.
Des exemples relevant de domaines variés sont à privilégier.

Algorithme itératif

L’exponentiation est une opération mathématique que l’on peut traduire par plusieurs algorithmes. $$a^n=\underbrace{a ×….× a}_{n~fois}\qquad et\ a^0=1$$

                    
def puissance_perso(x:int, n:int) -> int:
  res = 1
  while not n == 0:
      res = res * x
      n = n - 1
  return res
                        

Remarque

Le coût temporel est linéaire en fonction de l’exposant n.

Algorithme récursif

Première formulation mathématique récursive: $$ puissance(x,n) = \left{ \begin{array}{ll} 1 & si~ n=0 \ x.puissance(x,n-1) & si~ n>0 \end{array} \right. $$

                      
def puissance_recursif(x: int, n: int) -> int:
    if n == 0: # cas limite
        return 1
    else: # appel récursif
        return x*puissance_recursif(x, n-1)
      

Le coût temporel reste linéaire: la fonction effectue n appels récursifs. Seconde formulation récursive: $$ puissance(x,n) = \left{ \begin{array}{ll} 1 & si~ n=0 \ puissance(xx,n/2) & si~ n>0 ~ et~ n~pair\ x.puissance(xx,(n-1)/2) & si~ n>0 ~ et ~n~ impair \end{array} \right. $$

                    
def puissance_recursif_rapide(x: int, n: int) -> int:
    if n == 0: # cas limite
        return 1
    elif n % 2 == 0: # pair
        return puissance_recursif_rapide(x*x, n//2)
    else: # impair
        return x*puissance_recursif_rapide(x*x, n//2)
      

L’exposant est divisé par 2 à chaque appel. Si $n=2^p$ alors il y a p appels récursifs. Le coût temporel est logarithmique.

Annexes

Liens

Lien vers le notebook

    Sur Capytale

Pièces jointes