Algorithme récursive

Fermé
cil Messages postés 8 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 24 décembre 2007 - 24 déc. 2007 à 20:31
 maymo - 30 déc. 2007 à 18:17
Bonjour,
j'ai un petit un probleme en algo, quelqu'un peut m'aider a faire une fonction récursive qui permet d'enlever la premiere occurence d'une chaine de caractere?

18 réponses

merci pour l'explication, je suis bien en bac info et vous , je vous souhaite bonne annee pleine de succes.
1
bonjour,
enlever la première occurence de la chaine dans quoi? pouvez vous donner un exemple explicatif
0
merci pour la réponse rapide par exemple en un une chaine de caractere X et un caractere c donc enlever la premiere occurence de c dans la chaine et si il existe pas et ba en renvoie la chaine X

par exemple chaine de caractere("2 3 3 4 5" 3) la fonction ne donne "2 3 4 5"
un autre exemple ( "A B G C A" 'A') nous donne ("B G C A")
0
cil Messages postés 8 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 24 décembre 2007
24 déc. 2007 à 22:25
en faite j'ai pensé a faire
si x[1]= c ALORS je renvoie la chaine X- X[1]
SINO JE renvoyer fonction au deuxieme element de la chaine X et en garde le premier element tester de la chaine
mais je ne suis pas sure
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
votre proposition sera correcte en utilisant une fonction récursive mais en ajoutant juste une condition d'arret:
appel: f(x,1)
corps:
f(x:chaine,i:entier):chaine
Si(i>long(x))alors
retourner(x)
sinon
si x[i]=c alors retourner (x-x[i])
sinon retourner f(x,i+1)
Finsi
Finsi

et voici un programme solution en pascal si c'est le langage désiré:
program test;
uses wincrt;
var
ch:string;
c:char;
function supp_occ(ch:string; c:char;i:byte):string;
begin
if (i>length(ch))then
supp_occ := ch
else
begin
if (ch[i]=c)then
begin
delete(ch,i,1);
supp_occ := ch
end
else
supp_occ:= supp_occ(ch,c,i+1);
end;
end;

BEGIN
writeln('saisir la chaine:');
readln(ch);
writeln('saisir le caractère:');
readln(c);
Writeln('Le résultat est:',supp_occ(ch,c,1));
end.

j'éspère que votre problème est maintenant résolu?
0
cil Messages postés 8 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 24 décembre 2007
24 déc. 2007 à 23:09
merci bcp
c'est ça
0
bonsoit, qui peut m'aider a resoudre cet exercice:
Analyser une fonction récursive booléenne qui détermine si une chaîne de caractères CH comporte plus de caractères C1 que de caractères C2. (Cette fonction retourne VRAI si le nombre de C1 est supérieur à celui de C2 dans la chaîne).merci d'avance.
0
bonsoir,

fonction tester(ch:chaine; c1,c2:caractere; nc1,nc2,i:entier):booleen
Si(i>long(ch)) alors
retourner(nc1>nc2)
Sinon
si (ch[i]=c1) alors retourner tester(ch,c1,c2,nc1+1,nc2,i+1) finsi
si (ch[i]=c2) alors retourner tester(ch,c1,c2,nc1,nc2+1,i+1) finsi

Finsi
Fin tester


l'appel dans le programme pincipale doit être: b<-- tester(ch,c1,c2,0,0,1)
0
pardon, la fonction une condition:

...
sinon
si(ch[i]=c1) alors retourner .....
sinon si (ch(i]=c2) alors retourner ......
sinon retourner tester (ch,c1,c2,nc1,nc2,i+1)
finsi
0
merci bien pour la correction.j'ai un autre exercice qui me semble difficile, c'est le suivant:
soit la procedure iteratif suivante:
procedure compter;
var i:integer;
begin
s:=0;
for i:=1 to n do
s:=s+sqr(i);
end;
transformer cette procedure en une procedure recursive qui admet un parametre?
0
procedure compter(i:integer);
begin
if(i>n)
s:=0
else
s:=sqr(i)+compter(i+1)
end;

l'initialisation s:=0; doit être faite en dehors de la procédure
0
bonsoir, je crois que votre solution n'est pas correcte car on peut pas ecrire sqr(i)+compter(i+1)( compter n'est pas une fonction!!!)
0
bonsoir,
oui, vous avez raison, j'ai pas fais attention.
donc:
procedure compter(i:integer);
begin
if(i>n)
s:=0
else
begin
compter(i+1) ;
s:=sqr(i)+s;
end;
end;

c'est ça, non?
0
plus tôt: s:=sqr(i)+s; puis compter(i+1);
0
bonsoir,la solution n'est pas correcte dans les deux cas ou vous appelez la procedure avec 1 ou n parceque dans le cas d'une procedure la valeur de la variable locale ne passe pas a l'appel precedent , si vous testez le programme ca marche pas,
0
bonsoir mon ami,
je ne sais pas de quelle variable locale vous parlez, il n'y a acune variable locale utilisée car lorsque il s'agit de récursivité on déclare pas des variables à l'interieur. sauf la condition if i>n then s:=0 ici est faite lorsque j'ai envoyé la première solution dont j'ai pris compter comme fonction et non pas procédure.
testez le programme suivant et vous allez être sûr que j'ai raison:
-----------------------

program exemple;
uses wincrt;
var
s:integer;
n:integer;


procedure compter(i:integer);
begin
if(i<n)then
begin
s:=sqr(i)+s;
compter(i+1);
end;
end;

begin
s:=0;
write('n=');
readln(n);
compter(1);
writeln('le resultat est:',s);
writeln('alors, c'est correct maintenant ?');
end.
0
merci bien , la solution est correcte ,seulement il fau changer if i<=n .mais avec votre solution, ca devient floue dans ma tête a propos de la récursivité, j'ai crus que compter(3) ne peut pas utiliser la valeur de s trouver dans compter (2) qui ne peut pas utiliser s trouver dans compter(1) , est ce que vous avez compris?????? si vous pouvez m'expliquer le principe,merci d'avance.
0
bonsoir,
la variable s dans le programme est une variable globale, c.a.d qu'elle est connue à tout endroit du programme donc à chaque appel de la procedure compter on va utiliser la valeur courante de s. Plus précisement, on a un seul objet nommé s pour tout le programme, après appel par exemple de compter(2) le cotenu de la variable s est modifié, donc qu'elle est la valeur de s qui va être utilisée dans compter(3)???
c'est certainement la dernière valeur trouvée.
cela est équivalent au cas où s est passée en paramètre mais un passage par variable: compter(i:integer; var s:integer);
j'espère que vous arrivez à me comprendre.
question: êtes vous en bac info?
bonne chance......
0