Dreuteu
Messages postés44Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention28 février 2006 14 nov. 2004 à 12:10
Oui, effectivement, c'est bien ce que j'avais commencé a comprendre...
En gros, ca revient a faire la même syntaxe qu'en algo pur et dur aussi :D
Globus56
Messages postés7Date d'inscriptionmercredi 10 novembre 2004StatutMembreDernière intervention27 août 2007 14 nov. 2004 à 12:03
Super ton idée, JulioDelphi, même que ça s'appelle la "récursivité".
Tu pouvais encore faire l'économie du "or (n=1)"... puisque si n=1, n-1=0 et on peut calculer (n-1)! avec l'appel récursif.
Quant à l'erreur, elle est simplement signalée par le compilateur, ce n'est pas une erreur de calcul mais dans le cas où on a appelé la fonction avec une valeur >68, l'Exit fait sortir de la fonction sans avoir affecté de valeur. Il suffit d'ajouter Factorielle:=0; juste avant Exit si on décide par exemple d'affecter une valeur nulle si le calcul est impossible.
Ca m'a obligé à rechercher dans l'aide, mais vérification faite, result:=... doit faire exactement le même effet que d'affecter la valeur à la fonction comme on fait en Pascal "pur et dur".
Dreuteu
Messages postés44Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention28 février 2006 12 nov. 2004 à 15:08
Exact merci! je n'avais pas fait attention au nom de ta fonction... Moi qui fais du CaMl pourtant...
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 12 nov. 2004 à 12:37
pas de boucle For justement ! je refais appel a ma fonction DANS ma fonction ! ce qui boucle tout seul :)
euh pour les erreurs de calcul euh ... ha bon ? bah ajoute result alors :)
bonne prog
Dreuteu
Messages postés44Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention28 février 2006 12 nov. 2004 à 11:16
Euh... exact, j'avais pas vérifié ca... C'est mon prof qui m'a dit 69 comme limite sup... Brf, j'avais pensé utiliser autre chose, pourquoi pas un int64...
Par contre je ne comprend pas ton code... A mon avis il manque la boucle for, non?, Sinon je vois mal comment il peut être récursif...
De plus, quand je ne rajoute pas de ligne
result:=Fac;
j'ai des erreurs dans les résultats... :S
Merci en tout cas.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 12 nov. 2004 à 11:03
hello,
je te propose de reduire un peu le code avec ça :
Function Factorielle(n : integer) :int64;
Begin
if n>68 then begin showmessage('Nombre supérieur a 69, '#10#13'impossible de finir le calcul'); exit; end;
if (n 0) or (n 1) then
factorielle := 1
else
factorielle := n * factorielle (n - 1) ;
end ;
qu'en dis tu ? par contre moi, a partir de "66" je n'obtient deja plus de resultat, heureusement ke j'utilise un INT64, avec ton INTEGER je stop à 34 !!
Dreuteu
Messages postés44Date d'inscriptionsamedi 16 octobre 2004StatutMembreDernière intervention28 février 2006 12 nov. 2004 à 10:29
je vois un léger bug d'affichage:
ShowMessage('Nombre supérieur a 69, '#10#13'impossible de finir le calcul')
14 nov. 2004 à 12:10
En gros, ca revient a faire la même syntaxe qu'en algo pur et dur aussi :D
14 nov. 2004 à 12:03
Tu pouvais encore faire l'économie du "or (n=1)"... puisque si n=1, n-1=0 et on peut calculer (n-1)! avec l'appel récursif.
Quant à l'erreur, elle est simplement signalée par le compilateur, ce n'est pas une erreur de calcul mais dans le cas où on a appelé la fonction avec une valeur >68, l'Exit fait sortir de la fonction sans avoir affecté de valeur. Il suffit d'ajouter Factorielle:=0; juste avant Exit si on décide par exemple d'affecter une valeur nulle si le calcul est impossible.
Ca m'a obligé à rechercher dans l'aide, mais vérification faite, result:=... doit faire exactement le même effet que d'affecter la valeur à la fonction comme on fait en Pascal "pur et dur".
12 nov. 2004 à 15:08
12 nov. 2004 à 12:37
euh pour les erreurs de calcul euh ... ha bon ? bah ajoute result alors :)
bonne prog
12 nov. 2004 à 11:16
Par contre je ne comprend pas ton code... A mon avis il manque la boucle for, non?, Sinon je vois mal comment il peut être récursif...
De plus, quand je ne rajoute pas de ligne
result:=Fac;
j'ai des erreurs dans les résultats... :S
Merci en tout cas.
12 nov. 2004 à 11:03
je te propose de reduire un peu le code avec ça :
Function Factorielle(n : integer) :int64;
Begin
if n>68 then begin showmessage('Nombre supérieur a 69, '#10#13'impossible de finir le calcul'); exit; end;
if (n 0) or (n 1) then
factorielle := 1
else
factorielle := n * factorielle (n - 1) ;
end ;
qu'en dis tu ? par contre moi, a partir de "66" je n'obtient deja plus de resultat, heureusement ke j'utilise un INT64, avec ton INTEGER je stop à 34 !!
12 nov. 2004 à 10:29
ShowMessage('Nombre supérieur a 69, '#10#13'impossible de finir le calcul')
est bien en une seule ligne et entre quotes...