Aller au contenu

Palindrome

Des mots tels que "radar", "sos" sont des palindromes: on peut les lire dans les deux sens.

def estPalindrome(mot):
    """
    mot -- chaîne de caractères

    renvoie True si mot est un palindrome, False sinon.
    """

    gauche, droite = 0, len(mot)-1
    reponse = 1

    while gauche <= droite:
        if mot[gauche] == mot[droite]:
            gauche = gauche + 1
            droite = droite - 1
        else:
            reponse = 0
            break
    return reponse == 1

Note

L'instruction break fait sortir de la boucle dès qu'elle est exécutée.

  • Est-ce que droite est un variant de la boucle?
Réponse

Non. droite prend des valeurs entières décroissantes, mais non strictement décroissantes (cas où l'on exécute else dans le test). La variable pourrait donc, a priori, prendre une infinité de fois une même valeur: elle ne peut garantir la terminaison.

  • Montrer que la boucle termine en établissant que d = droite -gauche + reponse est un variant de la boucle.
Une résolution

Soit d = droite -gauche + reponse

  • d prend des valeurs entières (car gauche et droite sont initialisés à des valeurs entières ainsi que reponse puis subissent des opérations les laissant entiers).

  • d prend des valeurs positives dans la boucle (car on n'entre dans la boucle que lorsque droite ≥ gauche, et reponse est positif ou nul).

  • A chaque tour de boucle:

    • soit reponse passe de 1 à 0 (et on sort de la boucle) et dans ce cas d décroît strictement.
    • soit gauche augmente strictement (donc -gauche décroît strictement) et droite décroît strictement, donc d = droite + (-gauche) décroît strictement.

d est donc un variant de boucle.

On a explicité un variant de boucle donc la boucle termine.

Remarque.

On peut allèger légèrement ce code ainsi:

def estPalindrome(mot):
    """
    mot -- chaîne de caractères

    renvoi -- True si mot est un palindrome, False sinon.
    """

    gauche, droite = 0, len(mot)-1

    while gauche <= droite:
        if mot[gauche] == mot[droite]:
            gauche = gauche + 1
            droite = droite - 1
        else:
            return False
    return True