Suppression de doublons consécutifs⚓︎
Exercice difficile
Écrire une fonction récursive nettoie
qui renvoie une copie de son paramètre texte
où l'on a supprimé deux caractères consécutifs identiques, en répétant l'action si nécessaire.
Exemple
🐍 Console Python
>>> nettoie('bbcdaadz')
'cz'
En effet :
- on peut supprimer
'bb'
, ce qui donne'cdaadz'
- on peut supprimer
'aa'
, ce qui donne'cddz'
- on peut supprimer
'dd'
, ce qui donne'cz'
Quel que soit l'ordre de suppression des doublons, on arrive à 'cz'
Indices
Il faudrait envisager trois cas distincts :
- le
texte
fait moins de deux caractères, - le
texte
commence par deux caractères identiques, - le
texte
commence par deux caractères différents.
Pensez à ajouter une docstring et de nombreux tests unitaires !
###
Réponse
🐍 Script Python
def nettoie(texte):
"""Renvoie le texte nettoyé suivant la règle donnée"""
if len(texte) < 2:
return texte
elif texte[0] == texte[1]:
return nettoie(texte[2:])
else:
# Il y a deux caractères distincts au début
suite = nettoie(texte[1:])
if len(suite) > 0 and texte[0] == suite[0]:
return suite[1:]
else:
return texte[0] + suite
- Analysez tranquillement cette solution, plusieurs fois !!!
- Attardons-nous ensuite sur la ligne suivante :
if len(suite) > 0 and texte[0] == suite[0]:
- il y a une évaluation paresseuse du
and
, - si
len(suite) > 0
est faux, la suite duand
n'est pas testée (c'est inutile), et aucune erreur n'est provoquée avecsuite[0]
(pourtantsuite
est vide) !!!
- Analysez encore cette solution !!!