Algorithme récursive

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?
Configuration: Windows Vista
Internet Explorer 7.0

18 réponses

  1. merci pour l'explication, je suis bien en bac info et vous , je vous souhaite bonne annee pleine de succes.
    1. 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......
      1. 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.
        1. 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.
          1. 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,
            1. 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?
              1. 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!!!)
                1. 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
                  1. 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?
                    1. 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
                      1. 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)
                        1. 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.
                          1. 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?
                            1. 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
                              1. 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")
                                1. bonjour,
                                  enlever la première occurence de la chaine dans quoi? pouvez vous donner un exemple explicatif