Bonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Bonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Bonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Tu as oublié une règle importante : éviter les cas spéciaux.
Il n'y a aucune raison de mettre un if. Même en restant avec
l'incrémentation et les trois variables :
int
fib( int n )
{
int moinsUn = 1 ;
int moinsDeux = 1 ;
int reponse = 1 ;
for ( int compte = 1 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
}
[...]
J'aimerais savoir quand même une chose. D'où vient ce 3 ? Il
n'apparaît nulle part dans mes versions, et j'ai l'impression qu'il
donne de mauvais résultats.
En fait, nous n'avons pas la même règle : j'étais allé voir un pdf qui
Tu as oublié une règle importante : éviter les cas spéciaux.
Il n'y a aucune raison de mettre un if. Même en restant avec
l'incrémentation et les trois variables :
int
fib( int n )
{
int moinsUn = 1 ;
int moinsDeux = 1 ;
int reponse = 1 ;
for ( int compte = 1 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
}
[...]
J'aimerais savoir quand même une chose. D'où vient ce 3 ? Il
n'apparaît nulle part dans mes versions, et j'ai l'impression qu'il
donne de mauvais résultats.
En fait, nous n'avons pas la même règle : j'étais allé voir un pdf qui
Tu as oublié une règle importante : éviter les cas spéciaux.
Il n'y a aucune raison de mettre un if. Même en restant avec
l'incrémentation et les trois variables :
int
fib( int n )
{
int moinsUn = 1 ;
int moinsDeux = 1 ;
int reponse = 1 ;
for ( int compte = 1 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
}
[...]
J'aimerais savoir quand même une chose. D'où vient ce 3 ? Il
n'apparaît nulle part dans mes versions, et j'ai l'impression qu'il
donne de mauvais résultats.
En fait, nous n'avons pas la même règle : j'étais allé voir un pdf qui
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
|> Je viens de regarder dans le "Introduction à l'algorithmique",
|> par Thomas Cormen, Charles Leiserson, Ronald Rivest. Ça donne la
|> même chose, mais plus clair :
|> f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2) pour n > 1 [donc f(2) = 1]
OK. Dans ce cas, l'algorithme serait :
int prec = 1 ;
int result = 0 ;
while ( n > 0 ) {
int tmp = result ;
result += prec ;
prec = tmp ;
-- n ;
}
return result ;
ou
int moinsUn = 1 ;
int moinsDeux = 0 ;
int reponse = 0 ;
for ( int compte = 0 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
Dans ce cas-là, la version à trois variables me paraît
justifiable. Mais ça ne me plaît toujours pas pleinement qu'il y a
une initialisation « magique » de prec/moinsUn.
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
|> Je viens de regarder dans le "Introduction à l'algorithmique",
|> par Thomas Cormen, Charles Leiserson, Ronald Rivest. Ça donne la
|> même chose, mais plus clair :
|> f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2) pour n > 1 [donc f(2) = 1]
OK. Dans ce cas, l'algorithme serait :
int prec = 1 ;
int result = 0 ;
while ( n > 0 ) {
int tmp = result ;
result += prec ;
prec = tmp ;
-- n ;
}
return result ;
ou
int moinsUn = 1 ;
int moinsDeux = 0 ;
int reponse = 0 ;
for ( int compte = 0 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
Dans ce cas-là, la version à trois variables me paraît
justifiable. Mais ça ne me plaît toujours pas pleinement qu'il y a
une initialisation « magique » de prec/moinsUn.
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> writes:
|> Je viens de regarder dans le "Introduction à l'algorithmique",
|> par Thomas Cormen, Charles Leiserson, Ronald Rivest. Ça donne la
|> même chose, mais plus clair :
|> f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2) pour n > 1 [donc f(2) = 1]
OK. Dans ce cas, l'algorithme serait :
int prec = 1 ;
int result = 0 ;
while ( n > 0 ) {
int tmp = result ;
result += prec ;
prec = tmp ;
-- n ;
}
return result ;
ou
int moinsUn = 1 ;
int moinsDeux = 0 ;
int reponse = 0 ;
for ( int compte = 0 ; compte < n ; compte ++ ) {
reponse = moinsUn + moinsDeux ;
moinsDeux = moinsUn ;
moinsUn = reponse ;
}
return reponse ;
Dans ce cas-là, la version à trois variables me paraît
justifiable. Mais ça ne me plaît toujours pas pleinement qu'il y a
une initialisation « magique » de prec/moinsUn.
Mais il s'agit de l'énoncé, non ? De la même manière que la valeur
d'initialisation de result/reponse est 0, ou f(0), l'initialisation de
prec/moinsUn correspond à 1, ou f(1).
Non ?
Si, si, vous avez tout à fait raison. En fait, c'est même plus que ça, la
Mais il s'agit de l'énoncé, non ? De la même manière que la valeur
d'initialisation de result/reponse est 0, ou f(0), l'initialisation de
prec/moinsUn correspond à 1, ou f(1).
Non ?
Si, si, vous avez tout à fait raison. En fait, c'est même plus que ça, la
Mais il s'agit de l'énoncé, non ? De la même manière que la valeur
d'initialisation de result/reponse est 0, ou f(0), l'initialisation de
prec/moinsUn correspond à 1, ou f(1).
Non ?
Si, si, vous avez tout à fait raison. En fait, c'est même plus que ça, la
"Tim" a écritBonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Je suppose que ce code vient d'un polycopié, d'un livre ou d'un professeur.
Si le but est de montrer le traitement non récursif d'un problème qui l'est
naturellement, le résultat n'est pas brillant.
Ce qui est peut-être peu visible, c'est que le calamiteux :
for (n -= 3; n; n--){...}
ne fait rien d'autre que de compter (n - 3) coups.
Remarquez que le n n'est pas utilisé dans la boucle, et que le fait qu'il
compte en descendant ne change rien, si ce n'est ajouter à la confusion.
Tout ce qui se passe, c'est que "reponse" est rendu égal à [moinsDeux +
moinsUn], et ce (n - 3) fois, à partir de :
reponse = 2
moinsUn = 1
moinsDeux = 1
qui sont les bonnes valeurs au rang 3.
C'est bien comme ça que nous calculons mentalement, f(3) à partir de f(1) et
f(2) et en retenant f(2) et f(3), puis f(4) à partir de f(2) et f(3) et en
retenant f(3) et f(4), etc.
Pour corriger le code et en améliorer la lisibilité :
- Utiliser le même nom dans le prototype et la définition.
- "position" est ambiguë, puisqu'il sera utilisé dans une boucle.
Choisissons "valeur", ou "rang" par exemple.
- Sauf nécessité, je préfère considérer constant ce paramètre effectif, au
moins pour que le nom garde son sens. Faire confiance au compilateur (ou
alors en changer), créer une vraie variable de boucle ne va pas dégrader
grandement les performances!
- Personnellement, je n'en fais pas une règle absolue, mais ici un seul
return suffit ici.
- Coller autant que faire se peut à la réalité : éviter de faire une boucle
à l'envers de l'intuitif.
- "n" est un int, pas un bool. Donc, le test aurait du être (n != 0). En
fait, il eut mieux valu utiliser des unsigned int, et tester (n > 0).
- n -= 3 au niveau du for(;;) est un gag.
- Ne pas confondre compacité du source et rapidité et/ou compacité du code
généré.
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
for (int compteur = 3, moinsUn = 1, moinsDeux = 1;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;//f(n) = f(n-1) + f(n-2)
// préparation pour l'éventuelle itération suivante
moinsDeux = moinsUn; //f(n-1) devient f(n-2)
moinsUn = reponse; //f(n) devient f(n-1)
}
}
return reponse;
}
Vous pouvez également ne pas aimer les multiples initialisations dans le
for(;;), et rendre le code compatible C pour pas cher :
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
int compteur;
int moinsUn = 1;
int moinsDeux = 1;
for (compteur = 3;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;/*f(n) = f(n-1) + f(n-2)*/
/*préparation pour l'itération suivante éventuelle*/
moinsDeux = moinsUn; /*f(n-1) devient f(n-2)*/
moinsUn = reponse; /*f(n) devient f(n-1)*/
}
}
return reponse;
}
Cordialement,
Pierre
Bonjour, je vous remercie pour toutes ces réponses.
"Tim" <timythe@freemail.ru> a écrit
Bonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Je suppose que ce code vient d'un polycopié, d'un livre ou d'un professeur.
Si le but est de montrer le traitement non récursif d'un problème qui l'est
naturellement, le résultat n'est pas brillant.
Ce qui est peut-être peu visible, c'est que le calamiteux :
for (n -= 3; n; n--){...}
ne fait rien d'autre que de compter (n - 3) coups.
Remarquez que le n n'est pas utilisé dans la boucle, et que le fait qu'il
compte en descendant ne change rien, si ce n'est ajouter à la confusion.
Tout ce qui se passe, c'est que "reponse" est rendu égal à [moinsDeux +
moinsUn], et ce (n - 3) fois, à partir de :
reponse = 2
moinsUn = 1
moinsDeux = 1
qui sont les bonnes valeurs au rang 3.
C'est bien comme ça que nous calculons mentalement, f(3) à partir de f(1) et
f(2) et en retenant f(2) et f(3), puis f(4) à partir de f(2) et f(3) et en
retenant f(3) et f(4), etc.
Pour corriger le code et en améliorer la lisibilité :
- Utiliser le même nom dans le prototype et la définition.
- "position" est ambiguë, puisqu'il sera utilisé dans une boucle.
Choisissons "valeur", ou "rang" par exemple.
- Sauf nécessité, je préfère considérer constant ce paramètre effectif, au
moins pour que le nom garde son sens. Faire confiance au compilateur (ou
alors en changer), créer une vraie variable de boucle ne va pas dégrader
grandement les performances!
- Personnellement, je n'en fais pas une règle absolue, mais ici un seul
return suffit ici.
- Coller autant que faire se peut à la réalité : éviter de faire une boucle
à l'envers de l'intuitif.
- "n" est un int, pas un bool. Donc, le test aurait du être (n != 0). En
fait, il eut mieux valu utiliser des unsigned int, et tester (n > 0).
- n -= 3 au niveau du for(;;) est un gag.
- Ne pas confondre compacité du source et rapidité et/ou compacité du code
généré.
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
for (int compteur = 3, moinsUn = 1, moinsDeux = 1;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;//f(n) = f(n-1) + f(n-2)
// préparation pour l'éventuelle itération suivante
moinsDeux = moinsUn; //f(n-1) devient f(n-2)
moinsUn = reponse; //f(n) devient f(n-1)
}
}
return reponse;
}
Vous pouvez également ne pas aimer les multiples initialisations dans le
for(;;), et rendre le code compatible C pour pas cher :
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
int compteur;
int moinsUn = 1;
int moinsDeux = 1;
for (compteur = 3;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;/*f(n) = f(n-1) + f(n-2)*/
/*préparation pour l'itération suivante éventuelle*/
moinsDeux = moinsUn; /*f(n-1) devient f(n-2)*/
moinsUn = reponse; /*f(n) devient f(n-1)*/
}
}
return reponse;
}
Cordialement,
Pierre
Bonjour, je vous remercie pour toutes ces réponses.
"Tim" a écritBonjour,
Je suis un débutant en C++. J'ai besoin d'aide car je ne comprends pas
le fonctionnement d'une fonction qui sert à déterminer la valeur d'un
nombre de Fibonacci à l'aide d'une itération. J'ai comrpis comment faire
la même chose à l'aide de la récursivité.
Voici le code source du programme, j'aimerais que quelqu'un qui comprend
la fonction "int fib(int n)" m'explique le fonctionnement de cette
fonction :
<code>couic</code>
Je suppose que ce code vient d'un polycopié, d'un livre ou d'un professeur.
Si le but est de montrer le traitement non récursif d'un problème qui l'est
naturellement, le résultat n'est pas brillant.
Ce qui est peut-être peu visible, c'est que le calamiteux :
for (n -= 3; n; n--){...}
ne fait rien d'autre que de compter (n - 3) coups.
Remarquez que le n n'est pas utilisé dans la boucle, et que le fait qu'il
compte en descendant ne change rien, si ce n'est ajouter à la confusion.
Tout ce qui se passe, c'est que "reponse" est rendu égal à [moinsDeux +
moinsUn], et ce (n - 3) fois, à partir de :
reponse = 2
moinsUn = 1
moinsDeux = 1
qui sont les bonnes valeurs au rang 3.
C'est bien comme ça que nous calculons mentalement, f(3) à partir de f(1) et
f(2) et en retenant f(2) et f(3), puis f(4) à partir de f(2) et f(3) et en
retenant f(3) et f(4), etc.
Pour corriger le code et en améliorer la lisibilité :
- Utiliser le même nom dans le prototype et la définition.
- "position" est ambiguë, puisqu'il sera utilisé dans une boucle.
Choisissons "valeur", ou "rang" par exemple.
- Sauf nécessité, je préfère considérer constant ce paramètre effectif, au
moins pour que le nom garde son sens. Faire confiance au compilateur (ou
alors en changer), créer une vraie variable de boucle ne va pas dégrader
grandement les performances!
- Personnellement, je n'en fais pas une règle absolue, mais ici un seul
return suffit ici.
- Coller autant que faire se peut à la réalité : éviter de faire une boucle
à l'envers de l'intuitif.
- "n" est un int, pas un bool. Donc, le test aurait du être (n != 0). En
fait, il eut mieux valu utiliser des unsigned int, et tester (n > 0).
- n -= 3 au niveau du for(;;) est un gag.
- Ne pas confondre compacité du source et rapidité et/ou compacité du code
généré.
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
for (int compteur = 3, moinsUn = 1, moinsDeux = 1;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;//f(n) = f(n-1) + f(n-2)
// préparation pour l'éventuelle itération suivante
moinsDeux = moinsUn; //f(n-1) devient f(n-2)
moinsUn = reponse; //f(n) devient f(n-1)
}
}
return reponse;
}
Vous pouvez également ne pas aimer les multiples initialisations dans le
for(;;), et rendre le code compatible C pour pas cher :
int fib(int valeur)
{
int reponse;
if (valeur < 3)
{
reponse = 1;
}
else
{
int compteur;
int moinsUn = 1;
int moinsDeux = 1;
for (compteur = 3;
compteur <= valeur;
compteur++)
{
reponse = moinsUn + moinsDeux;/*f(n) = f(n-1) + f(n-2)*/
/*préparation pour l'itération suivante éventuelle*/
moinsDeux = moinsUn; /*f(n-1) devient f(n-2)*/
moinsUn = reponse; /*f(n) devient f(n-1)*/
}
}
return reponse;
}
Cordialement,
Pierre
Bonjour, je vous remercie pour toutes ces réponses.
Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
"Tim" a écrit...
[...]Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
d'hab.car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
La boucle ne fait pas "-3 à chaque fois". Commençons par une forme générale
(un simple exemple) :
for(ActionI; Test; ActionF){//Code}
peut s'écrire :
ActionI;
si(Test)
faire {//Code}
ActionF;
Aller au si(Test)
(sinon)
//suite du programme
Ou plus C++ :
ActionI;
while(Test)
{
{//Code}
ActionF;
}
C'est important de bien maitriser cette structure, parcequ'en réalité on
peut mettre à peu près n'importe quoi à la place de ActionI, Test, ActionF.
Reste à traduire ces trois termes dans votre cas :
for (n -= 3; n; n--)
n -= 3, c'est n = n - 3. Si vous faites fib(12), n est réinitialisé à 9, une
fois avant le début de la boucle. Il eut été équivalent mais plus lisible de
passer par une autre variable :
for(int compteur = (n - 3); compteur; compteur--)
Le test if(n) signifie if(n != 0). Dans notre cas, ça peut s'écrire if(n >
0).
n-- signifie n = (n - 1). La forme n-- est répandue, elle correspond à une
instruction comme dec dans d'autres langages.
for (n = n - 3; n > 0; n--)
{
//Code
}
ou
for (int compteur = (n - 3); compteur > 0; compteur--){//Code}
n n'est pas utilisé dans la boucle. Donc, le seul résultat est de faire
tourner {//Code} (n - 3) fois. Bien voir que {//Code} ne tourne pas pour n > 0.
Pierre
Grace à vous pierre, j'ai enfin compris !! En fait, quand j'essaiais de
"Tim" <timythe@freemail.ru> a écrit...
[...]
Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
d'hab.
car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
La boucle ne fait pas "-3 à chaque fois". Commençons par une forme générale
(un simple exemple) :
for(ActionI; Test; ActionF){//Code}
peut s'écrire :
ActionI;
si(Test)
faire {//Code}
ActionF;
Aller au si(Test)
(sinon)
//suite du programme
Ou plus C++ :
ActionI;
while(Test)
{
{//Code}
ActionF;
}
C'est important de bien maitriser cette structure, parcequ'en réalité on
peut mettre à peu près n'importe quoi à la place de ActionI, Test, ActionF.
Reste à traduire ces trois termes dans votre cas :
for (n -= 3; n; n--)
n -= 3, c'est n = n - 3. Si vous faites fib(12), n est réinitialisé à 9, une
fois avant le début de la boucle. Il eut été équivalent mais plus lisible de
passer par une autre variable :
for(int compteur = (n - 3); compteur; compteur--)
Le test if(n) signifie if(n != 0). Dans notre cas, ça peut s'écrire if(n >
0).
n-- signifie n = (n - 1). La forme n-- est répandue, elle correspond à une
instruction comme dec dans d'autres langages.
for (n = n - 3; n > 0; n--)
{
//Code
}
ou
for (int compteur = (n - 3); compteur > 0; compteur--){//Code}
n n'est pas utilisé dans la boucle. Donc, le seul résultat est de faire
tourner {//Code} (n - 3) fois. Bien voir que {//Code} ne tourne pas pour n > 0.
Pierre
Grace à vous pierre, j'ai enfin compris !! En fait, quand j'essaiais de
"Tim" a écrit...
[...]Bonjour, je vous remercie pour toutes ces réponses.
Mais mon problème était pas de savoir si mon code source était le
meilleur mais que quelqu'un m'explique le fonctionnement de la fonction
C'est comme ça que je l'avais compris, mais j'ai un peu brodé .. comme
d'hab.car je ne comprenais pas pourquoi par ex. la boucle for fait - 3 à
chaque fois. Et je vous demande de l'aide car mes connaisences en
mathématiques sont très limitées, je ne suis qu'à la 3 eme année à
l'école secondaire.
Ce n'est pas grave, c'est de la simple arithmétque.
La boucle ne fait pas "-3 à chaque fois". Commençons par une forme générale
(un simple exemple) :
for(ActionI; Test; ActionF){//Code}
peut s'écrire :
ActionI;
si(Test)
faire {//Code}
ActionF;
Aller au si(Test)
(sinon)
//suite du programme
Ou plus C++ :
ActionI;
while(Test)
{
{//Code}
ActionF;
}
C'est important de bien maitriser cette structure, parcequ'en réalité on
peut mettre à peu près n'importe quoi à la place de ActionI, Test, ActionF.
Reste à traduire ces trois termes dans votre cas :
for (n -= 3; n; n--)
n -= 3, c'est n = n - 3. Si vous faites fib(12), n est réinitialisé à 9, une
fois avant le début de la boucle. Il eut été équivalent mais plus lisible de
passer par une autre variable :
for(int compteur = (n - 3); compteur; compteur--)
Le test if(n) signifie if(n != 0). Dans notre cas, ça peut s'écrire if(n >
0).
n-- signifie n = (n - 1). La forme n-- est répandue, elle correspond à une
instruction comme dec dans d'autres langages.
for (n = n - 3; n > 0; n--)
{
//Code
}
ou
for (int compteur = (n - 3); compteur > 0; compteur--){//Code}
n n'est pas utilisé dans la boucle. Donc, le seul résultat est de faire
tourner {//Code} (n - 3) fois. Bien voir que {//Code} ne tourne pas pour n > 0.
Pierre
Grace à vous pierre, j'ai enfin compris !! En fait, quand j'essaiais de
En fait, quand j'essaiais de
faire la fonction manuellement ( sur du papier je veux dire ) je fesais
à chaque fois - 3 ... mais maintenant j'ai comprit. Merci beaucoup
Pierre et à tous ceux qui ont répondu à ce post. Mais j'ai encore une
petite question, pq est-ce qu'on doit faire " - 3 " au début de la boucle
?
En fait, quand j'essaiais de
faire la fonction manuellement ( sur du papier je veux dire ) je fesais
à chaque fois - 3 ... mais maintenant j'ai comprit. Merci beaucoup
Pierre et à tous ceux qui ont répondu à ce post. Mais j'ai encore une
petite question, pq est-ce qu'on doit faire " - 3 " au début de la boucle
?
En fait, quand j'essaiais de
faire la fonction manuellement ( sur du papier je veux dire ) je fesais
à chaque fois - 3 ... mais maintenant j'ai comprit. Merci beaucoup
Pierre et à tous ceux qui ont répondu à ce post. Mais j'ai encore une
petite question, pq est-ce qu'on doit faire " - 3 " au début de la boucle
?