suivant: Un exemple : l'exponentiation
 monter: Récursion contre itération
 précédent: Récursion contre itération
     Table des matières 
     Index 
Récursivité terminale1#1
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 
82#82
dont la suite de retours
83#83
est en fait une suite d'égalités
84#84
Une définition de fonction est récursive terminale quand toute
invocation récursive est terminale.  La plupart des langages
fonctionnels, notamment Caml, exécutent un programme à récursivité
terminale comme s'il était itératif, c'est-à-dire en espace constant.
Certains compilateurs d'autres langages ont partiellement cette
capacité. Sinon, il est facile de transformer une définition récursive
terminale en itération pour optimiser l'exécution.  Le programme
dérécursivé est :
  static int factIter(int n) {
    int a = 1;
    while (n>1) {
      a = n*a;
      n = n-1;
    }
    return a;
  }
 
 
 
 
 
 suivant: Un exemple : l'exponentiation
 monter: Récursion contre itération
 précédent: Récursion contre itération
     Table des matières 
     Index 
Rene' LALEMENT
2002-11-07