lundi 18 avril 2016

[MI] Palindrome (solution simple - récursive)

Un palindrome est un mot qui présente le même ordre des caractères dans les deux sens (de gauche à droite et de draoite au gauche). Nous pouvons implémenter la solution par une boucle (Tant que) ou bien en utilisant le format récursive.

La solution récursive se base sur une idée simple : un mot est palindrome si son premier caractère est identique à son dernier caractère et le reste est aussi palindrome. L'expression du problème de cette façon permet une implémentation récursive : on définit le problème en fonction de lui même.
Vous devez ne pas oublier les conditions d'arrêts; Dans ce cas, nous avons deux :
  1. Le reste est vide : dans ce cas le mot est un palindrome parce que toutes les vérifications précédentes ont réussi,
  2. Deux caractères symétriques ne sont pas identiques : on arrête les vérifications et le mot (ou terme) n'est pas un palindrome.
Lorsqu'on dit qu'il s'agit d'une consition d'arrêt, cela veut dire que dans ce cas, la fonction ne va pas faire l'eppel à elle-même.
Le code suivant peut résoudre le problème (fonction + programme principal ) :


Program PalindromeRec;

{ 
  Une fonction récursive pour vérifier est-ce qu'un terme saisi est un palindrome ou pas
  Définition du palindrome :
  https://fr.wikipedia.org/wiki/PalindromeRec
}

function PalRec(s : String; pos : Integer) : Boolean;
Var
  symetrique : Integer;
Begin
  symetrique := Length(s) - pos + 1;
  
  If (pos >= symetrique) Then
  Begin
    { Une première condition d'arrêt : fin des vérification }
    PalRec := true;
  End
  Else
  Begin
    If (s[pos] = s[symetrique]) Then
    Begin
      PalRec := PalRec(s, pos + 1);
    End
    Else
    Begin
      { Une deuxième condition d'arrêt : l'échec d'une vérification }
      PalRec := false;
    End;
  End;
End;

Var
  mot : String[30];
  
Begin

  WriteLn('Veuillez saisir le mot à tester :');
  ReadLn(mot);
  WriteLn('Est-il palindrome ? : ', PalRec(mot, 1));
  
End.

L'exécution de ce code avec la saisi du mot : RADAR nous donne le résultat suivant :


Nous pouvons ajouter une fonction de décoration pour améliorer l'affichage et montrer la progression des traitements. Le résultat avec le même mot sera :


Vous pouvez télécharger ces codes sources par ici.