Une invocation récursive d'une fonction f est dite terminale si elle est de la forme return f(...); ; autrement dit, la valeur retournée est directement la valeur obtenue par l'invocation récursive, sans qu'il n'y ait d'opération sur cette valeur. Par exemple, l'invocation récursive de la factorielle
return n*f(n-1);
n'est pas terminale, puisqu'il y a multiplication par n avant de retourner. Par contre, l'invocation récursive dans
static int f(int n, int a) {
if (n<=1) {
return a;
} else {
return f(n-1,n*a);
}
}
est terminale. Dans cette version, le paramètre a joue le rôle
d'un accumulateur ; l'évaluation de f(5,1) conduit à la suite
d'invocations
static int factIter(int n) {
int a = 1;
while (n>1) {
a = n*a;
n = n-1;
}
return a;
}