Aller au contenu

Nombre encadré⚓︎

Exercice

Écrire une fonction récursive encadre qui permette d'obtenir [[[42]]] par exemple, avec comme paramètres : le contenu (ici, quarante-deux) et l'epaisseur de l'encadrement (ici, trois). On voudrait pouvoir obtenir aussi [[[[[1337]]]]].

  • Allez-vous utiliser print ou return ?
  • Quels seront les types de vos paramètres, et de la sortie ?

Indice

Pour afficher un texte sans aller à la ligne, on peut écrire print(texte, end="")

###

Réponse
🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> None:
    """Affiche le contenu avec une epaisseur de []"""
    if epaisseur == 0:
        print(contenu, end="")
    else:
        print("[", end="")
        encadre(contenu, epaisseur - 1)
        print("]", end="")
  • Cette solution est correcte,
  • elle peut s'utiliser avec encadre(42, 3) ou bien mieux avec encadre("42", 3)
  • mais il n'y a pas de retour à la ligne une fois fini,
  • et surtout, on ne peut pas réutiliser le résultat affiché dans une autre fonction.

Il vaut mieux une autre solution, qui renvoie le texte, que l'on affichera à part !

Bonne pratique : observez l'annotation des types, dans les cas simples, il faut se forcer à l'utiliser !

🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> str:
    """Renvoie le contenu encadré d'une épaisseur de []"""
    if epaisseur == 0:
        return contenu
    else:
        return "[" + encadre(contenu, epaisseur - 1) + "]"
  • Meilleure solution,
  • le résultat peut être remobilisé ou être affiché. Exemple :
🐍 Console Python
>>> encadre("On peut utiliser " + encadre("la fonction encadre", 3)+ " de manière plus complexe.", 2)
[[On peut utiliser [[[la fonction encadre]]] de manière plus complexe.]]

Il n'était pas possible de faire cela avec la version print.

🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> str:
    """Renvoie le contenu encadré d'une épaisseur de []"""
    if epaisseur == 0:
        return contenu
    else:
        return encadre("[" + contenu + "]", epaisseur - 1)

Variante correcte avec une différence fondamentale :

  • en dehors du cas de base, l'appel récursif est la dernière instruction de la fonction,
  • on appelle cette technique fonction récursive terminale,
  • Python n'en tire pas profit, et ne le fera jamais,
  • mais d'autres langages de programmation en tirent profit,
  • ils transforment le code automatiquement en code itératif qui peut consommer beaucoup moins de mémoire,
  • ceci est étudié en post BAC.