Palindrome

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Palindrome

Message par alb » sam. avr. 23, 2011 1:33 pm

Dans Aide/Manuels/Programmation/Les programmes récursifs/14.1.3 Les palindromes, on trouve:

Code : Tout sélectionner

palindrome(ph):={
local s;
if (s==0) return ph;
s:=size(ph)-1;
return concat(palindrome(tail(ph)),ph[0]);
}
Ce ne serait pas plutôt ? :

Code : Tout sélectionner

palindrome(ph):={
local s;
s:=size(ph);
if (s==0) return ph;
return concat(palindrome(tail(ph)),ph[0]);
}
Par exemple:
palindrome("esopeReStEeluparCetteCraPulEetseReposE")

C'est peut-être une façon ludique (fin d'année oblige) de commencer la récursivité au lycée
peut-être même en seconde, pourquoi pas en couple avec le français (Oulipo) ?
Sur le mode récursif, je donnerais (futurs premièreS et au delà):

Code : Tout sélectionner

AlenversRec(phrase):={
local s;
s:=size(phrase);
si s==0 alors retourne phrase
sinon
  retourne concat(AlenversRec(tail(phrase)),phrase[0])
fsi;
}
Sur le mode itératif, pour tous les élèves:

Code : Tout sélectionner

Alenvers(phrase):={
local s,k,temp,phraseinv;
temp:=phrase;
phraseinv:=NULL;
si size(phrase)==0 alors retourne phrase fsi;
pour k de 1 jusque size(phrase) faire //repeter
  s:=size(temp);
  phraseinv:=concat(phraseinv,temp[s-1]);
  temp:=suppress(temp,s-1);
fpour; //jusqua s==1
retourne phraseinv;
}
Si quelqu'un a une idée pour un programme itératif plus intuitif pour des secondes ...

Une remarque mineure: en faisant debug(Alenvers("esopeReStEeluparCetteCraPulEetseReposE"))
j'ai noté qu'en passant la souris sur cacher on lit Ajoute une variable au "watch" (?)

Quelques idées en vrac:
(Alenvers@Alenvers)("luc") pour vite oublier l'image de luc et parler de composée, de symétrie
Chercher les mots français invariants comme rever
Compléter le programme pour savoir si un mot ou une phrase est un palindrome
Pour tous niveaux voir les nombres de Lychrel
De quoi s'amuser en apprenant...
Dernière modification par alb le mar. avr. 26, 2011 8:07 pm, modifié 1 fois.

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Palindrome

Message par parisse » mar. avr. 26, 2011 7:03 am

en effet, il y a bien une inversion de lignes à faire dans palindrome.
Pour le debuggueur, il faudra que je change le tooltip, c'est le meme que pour la case watch pour la fonctionnalité inverse. watch et rmwatch permettent de définir quelles variables on veut voir (sinon ce sont les variables locales).

fred
Messages : 46
Inscription : mer. sept. 09, 2009 7:29 pm

Re: Palindrome

Message par fred » mar. avr. 26, 2011 8:41 am

bonjour

peut-être avec ce code ?

Code : Tout sélectionner

Alenvers2(phrase):={
local k,phraseinv;
phraseinv:=NULL;
si size(phrase)==0 alors retourne phrase fsi;
pour k de size(phrase)-1 jusque 0 pas -1 faire 
  phraseinv:=concat(phraseinv,phrase[k]);
fpour; 
retourne phraseinv;
}
il y a moins de variables locales, le compteur va décroissant...

Personnellement, je propose des programmes moins propres aux élèves : pas de test si la taille de la phrase est nulle, et j'apprécie pour commencer avec les 2nde le fait de pouvoir tout déclarer en variables globales. Cela me permet d'utiliser "l'outil programmation" sans faire de programmation.

Si je proposais ce programme à mes élèves il ressemblerait plutôt à :

Code : Tout sélectionner

Alenvers3(phrase):={
phraseinv:=NULL;
pour k de size(phrase)-1 jusque 0 pas -1 faire 
  phraseinv:=concat(phraseinv,phrase[k]);
fpour; 
retourne phraseinv;
}

alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Re: Palindrome

Message par alb » mar. avr. 26, 2011 5:39 pm

L’addiction à Xcas c’est terrible
J’avais pourtant juré de ne pas regarder le forum pendant une semaine …
Effectivement il faut raccourcir le nombre d’instructions dans la boucle : c’est beaucoup plus clair, mais je vais essayer de conserver l’incrémentation
Je vais garder le test si s==0 … pour que " " soit un palindrome
Je vais éviter le nom de variable phrase (trop ambigu) et prendre chaine
Concernant local/global j’aimerais pouvoir expliquer aux élèves avec un exemple simple la différence. Comment ?
En faisant about(temp) et about(chaine) en déclarant temp en local ou pas, je pense que c'est assez clair ?

Je pense pouvoir proposer ceci à des élèves de seconde:

Code : Tout sélectionner

Alenvers(chaine):={
local temp,s,k;
temp:=NULL;
s:=size(chaine);
si s==0 alors retourne "" fsi;
pour k de 1 jusque s faire 
  temp:=concat(temp,chaine[s-k]);
fpour; 
retourne temp;
}:;
est_palindrome(chaine):={
si Alenvers(chaine)==chaine alors
  afficher("la chaîne est un palindrome");
  retourne 1;
sinon
  afficher("la chaîne n'est pas un palindrome");
  retourne 0;
fsi;
}:;

alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Re: Palindrome

Message par alb » jeu. avr. 28, 2011 11:38 am

On peut faire plus simple avec (test inutile et chaîne "" prise en compte):

Code : Tout sélectionner

Alenvers(chaine):={
local temp,s,k;
temp:="";
s:=size(chaine);
pour k de 1 jusque s faire 
  temp:=temp,chaine[s-k];
fpour; 
retourne cat(temp);
}:;
Remarque: l'instruction
pour k de 1 jusque 0 faire ... fpour
n'est donc pas une erreur de syntaxe,elle est simplement ignorée.

Répondre