Exercice : Un accumulateur
Pour un calcul de factoriels de n, le résultat de chaque étape fact(i) sera multiplié par i+1* ... *n.
Le produit est donc : n * (n-1 * (n-2 *( ...*1 ) ) ).
Si on tient compte de la priorité des opérateurs, c'est équivalent à : 1*1*2*...*n.
La commutativité de la multiplication nous permet d'écrire : n*(n-1)*(n-2)*...*1.
La valeur de contrôle de la récursivité est également le facteur du produit. Pour rendre la fonction terminale, nous devons supprimer le produit au retour de l'appel récursif. Il faut donc le réaliser avant celui-ci.
Tout revient à dire qu'à l'étape i, le résultat est (n*n-1*...*i+1) * i!. Le résultat à l'étape 0 sera (n*n-1*...*1)*0!. Ce produit doit donc être transmis au cours de l'appel, à l'aide d'un paramètre que nous appellerons « accumulateur ».
Pour la fonction de prototype « fact_acc(int n, int acc)
», définissez la valeur de retour du cas d'arrêt.
Le paramètre acc est multiplié à chaque étape par la valeur n.
Il en découle que, pour obtenir le résultat voulu, la fonction doit être appelée avec une valeur initiale de acc neutre, c'est-à-dire 1 pour la multiplication.