Saisie recursivive

Résolu
sonya -  
 le père -
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
  • 2
  1. le père
     
    Bonsoir

    Il ne manque pas un petit quelque chose ?
    et si 3 <= n <= 50 ?

    D'autre part : à quoi sert le n que tu passe en paramètre ? la première chose que tu fais, c'est de le lire
    0
  2. sonya
     
    pour la condition sur le n je voudrais que le n soit compris entre 3 et 50 par conséquent il doitaccepter ces valeurs si on les introduit.et j'ai pas compris ce que tu veux dire par le n comme paramère si c pas le n alors qu'est ce que ça peut etre .merci
    0
  3. le père
     
    Si n est inférieur à 3, ta fonction rend bien quelque chose : saisie_n:=saisie_n(n);
    Si n est supérieur à 50, ta fonction rend bien quelque chose : saisie_n:=saisie_n(n);
    si n est entre les deux, que rend ta fonction ? Quelle est la ligne saisie_n:= qq chose qui est exécutée dans ce cas ? Aucune.

    j'ai pas compris ce que tu veux dire par le n comme paramère
    Ce que je veux dire, c'est que que tu appelles saisie_n(1) , saisie_n(2), saisie_n(35) ou saisie_n(2000) le résultat sera toujours le même. Il va dépendre uniquement de ce qu'on tape, pas du 1,2,35 ou du 2000. Donc ton paramètre ne sert absolulement à rien.
    0
  4. sonya
     
    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;
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. le père
     
    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
    0
  7. le père
     
    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 ?
    0
  8. sonya
     
    est-ce qu'il ne manquerai pas plutot quelque chose?

    if (minimum>t[i]) then begin minimum:=t[i];
    min:=minimum;
    end;
    0
  9. sonya
     
    oui,mais avec le paramètre minimum qui change à chaque fois
    0
  10. le père
     
    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;
    0
  11. sonya89 Messages postés 11 Statut Membre
     
    oh mon Dieu je crois que je vais m'arracher les cheveux!ça ne merche encore pas
    0
  12. sonya89 Messages postés 11 Statut Membre
     
    au fait sonya89 c encore moi sonya (j me suis inscrise)
    0
  13. le père
     
    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
    0
  14. sonya89 Messages postés 11 Statut Membre
     
    ouiiiiiiiiiiiiiiiiiiiiiii,ça marche maintenant lorsque j'ai plaçé le min:=minimum; aprés le end.j te remercie du fond du coeur.
    0
  15. sonya89 Messages postés 11 Statut Membre
     
    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.
    0
  16. le père
     
    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
    0
  17. sonya89 Messages postés 11 Statut Membre
     
    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.
    0
  18. sonya89
     
    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
    0
  19. le père
     
    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;
    0
  20. salhi
     
    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!)
    0
    1. le père
       
      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.
      0
  • 1
  • 2