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.
A voir également:

23 réponses

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
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
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
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

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

Posez votre question
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
sonya
 
là je bloque complétement!
0
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
sonya
 
est-ce qu'il ne manquerai pas plutot quelque chose?

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