Saisie recursivive

Résolu
Bonjour,
je voudrais faire un modul(fonction) recursif qui fait la saisie d'un entier et qui l'affiche
mais lorsque j'execute il me donne une valeure eronnée voici ce que j'ai ecrit:

function saisie_n( n:integer):integer;
begin
writeln('donner la taille du tableau');
readln(n);
if (n<3) then saisie_n:=saisie_n(n);
if (n>50) then saisie_n:=saisie_n(n);
end;

quelqu'u n pourrait m'aider svp,merci d'avance.
Configuration: Windows XP
Internet Explorer 7.0

23 réponses

  1. Bonjour khaled,
    si vous êtes en bac info, visitez www.salhi-sami.fr.gd
    1. j'ai des problemes avec la récurcivité et d'étuliser les tris AIDE MOI et merci d'avance
      1. bonjour le père,
        votre fonction est récursive, elle s'appele peut être donc un certain nombre de fois, chaque appel contient une déclaration de la variable n, çelà n'est-il pas génant?
        moi je propose de passer n par variable en paramètre ou bien de la déclarer en dehors du corps de la fonction. (ça c'est si en pense aux ressources bien sûr!)
        1. Bonjour,

          Qu'une variable N soit réservée à chaque appel, cela n'est pas gênant, c'est même souhaitable dans la plupart des cas de fonctions récursives.
          Si tu passes n en paramètre, c'est comme si tu la redéclares à chaque appel : une nouvelle variable est réservée dans la mémoire à chaque appel. De plus, le passage de paramètre sert à fournir une information à la fonction appelée (la valeur de n); or, la première chose que fait la fonction, c'est détruire cette information en lisant n. C'est absurde de passer une information quand on sait que la fonction ne va pas en tenir compte !
          Déclarer n en dehors de la fonction est possible dans ce cas précis (parce que la valeur de n n'est pas ré-utilisée après l'appel récursif à la fonction) mais d'une manière générale, les variables globales sont à éviter et c'est le rôle d'une variable qui détermine si elle doit être locale ou globale.
          Si tu penses aux ressources, il y a effectivement une économie à faire en rendant n globale MAIS :
          -La première économie à faire, c'est de faire une boucle pour tester la valeur saisie, n'oublions pas que chaque appel récursif sauvegarde dans la mémoire tout un contexte d'exécution (adresse de retour, paramètres, variables locales et registres du processeur)
          -L'économie faite est absolument ridicule, le facteur limitant étant ici l'opérateur (saisie manuelle). Il faut qu'il s'obstine à saisir des valeurs erronées pendant des heures ou des jours avant qu'il y ait le moindre risque de manque de mémoire, même avec les plus petites machines existant actuellement.
      2. Bonjour,

        function saisie_n:integer;
        VAR
        n: integer;
        begin
          writeln('donner la taille du tableau');
          readln(n);
          if (n<3) or (n>50) then
            saisie_n:=saisie_n
          else
            saisie_n:=n;
        end;
        1. je te salu le père,je viens d'avoir la confirmation de me prof de programmation qu'une saisie d'un entier ne peut se faire qu'en une procedure. mais elle ne m'a pas satisfaite par son explication pourais-tu m'aider stp.merci d'avance
          1. en fait, c parceque je me suis lançée un défi:résoudre tout un problème(projet) en récursivité meme si dois paraitre fou et puisque je suis une fonçeuse et que je vais toujours au bout, je ne dois pas abandonée avant de trouver la solution.alors j te promets que la prochaine fois que j te contacterai c pour t'annoncer la solution. merci encore et bon week-end à toi aussi.
            1. dois-je conclure qu'il ne peut etre qu'une procedure
              Non, on peut sûrement faire 'tourner' la fonction en aménageant un peu. Je n'ai pas le courage de m'y lancer maintenant.
              Il faut quand même être complètement tordu pour vouloir à tout prix utiliser la récursivité pour borner une saisie !

              Bon week-end
              1. au fai a propos du modul de saisie dois-je conclure qu'il ne peut etre qu'une procedure.merci de me supporter aussi longtemps.
                1. ouiiiiiiiiiiiiiiiiiiiiiii,ça marche maintenant lorsque j'ai plaçé le min:=minimum; aprés le end.j te remercie du fond du coeur.
                  1. Je viens de l'essayer (en C, je n'ai pas de pascal) et ça marche.
                    A condition de déplacer le min:=minimum;
                    après le end (sinon, quand i=n on ne retourne aucune valeur)

                    Evidemment, il faut appeler la fonction avec dans minimum une très grande valeur et dans i le premier indice du tableau
                    1. oh mon Dieu je crois que je vais m'arracher les cheveux!ça ne merche encore pas
                      1. Et en remettant le tout dans l'ordre :

                        function min( minimum:integer;t:tab; i:integer):integer; 
                        begin 
                          if (i<n)then begin 
                            minimum:=min(minimum,t,(i+1)); 
                            if (minimum>t[i]) then minimum:=t[i]; 
                            min:=minimum; 
                          end; 
                        end;
                        1. est-ce qu'il ne manquerai pas plutot quelque chose?

                          if (minimum>t[i]) then begin minimum:=t[i];
                          min:=minimum;
                          end;
                          1. Ne nous occupons que de ces deux lignes

                            if (minimum>t[i]) then min:=t[i];
                            min:=min(minimum,t,(i+1));


                            1 - si minimum est > à t[i] alors tu fais min:= t[i];
                            ensuite tu fais min:=min(minimum,t,(i+1));

                            2 - si minimum est <= à t[i] alors tu ne fais pas min:= t[i];
                            mais tu fais min:=min(minimum,t,(i+1));

                            Dans les deux cas, la valeur de min est la même : c'est min:=min(minimum,t,(i+1))

                            Es-tu d'accord ?
                            1. au fait ça a marché avec cette procedure

                              Il y a une deux énormes différences entre les formes fonction et procedure dans les exemples que tu donnes
                              - dans la déclaration du paramètre n, il est déclaré VAR cette fois. donc quand on modifie n dans la procédure appelée, il l'est aussi dans la procédure appelante. Ce n'était pas le cas dans ta fonction. En fait le N joue ici le même rôle que la valeur que retournait ta fonction.
                              - comme il n'y a pas de valeur à retourner (au sens valeur de retour d'une fonction), tu n'oublies pas le cas où n est bon dès le départ, alors que tu l'oubliais avec la fonction

                              if (minimum>t[i]) then min:=t[i];
                              min:=min(minimum,t,(i+1));


                              Te rends tu compte que la première de ces deux lignes ne sert absolument à rien ?
                              Si oui, la correction doit te sauter aux yeux
                              Si non, réfléchis un peu à ce qui se passe dans les deux cas minimum>t[i]) et minimum<=t[i] avant de me redemander
                              1. au fait ça a marché avec cette procedure mais je ne sais pas pourquoi lorsque je la convertit en fontion ça ne marche plus:

                                procedure saisie_n(var n:integer);
                                begin
                                writeln('donner la taille du tableau');
                                readln(n);
                                if (n<3) then saisie_n(n);
                                if (n>50) then saisie_n(n);
                                end;

                                j'ai le meme problème avec cette fonction qui trouve le minimum d'un tableau :

                                function min( minimum:integer;t:tab; i:integer):integer;
                                begin
                                if (i<n)then begin

                                if (minimum>t[i]) then min:=t[i];
                                min:=min(minimum,t,(i+1));
                                end;
                                end;
                                • 1
                                • 2