next up previous contents
suivant: Exponentiation monter: Sous-programmes récursifs terminaux précédent: Sous-programmes récursifs terminaux   Table des matières

Factorielle

Étudions un exemple,


\begin{algorithm}[H]
\dontprintsemicolon
\Fonction{$factorielleT(n, r)$}
{
\eSi...
...{$r$}
}
{
\Retourner{$ factorielleT(n - 1, r \times n)$}
}
}
\end{algorithm}

Tout d'abord, on remarque que $factorielleT$ est bien une fonction récursive terminale. Ensuite observons que si l'on invoque $factorielleT(n, 1)$, on obtient la séquence suivante :


\begin{displaymath}
(n, 1) \longrightarrow (n - 1, n)\longrightarrow (n - 2, n \times
(n-1)) \longrightarrow \ldots
\end{displaymath}


\begin{displaymath}\ldots \longrightarrow (i, \prod_{k=i+1}^n k)
\longrightarrow \ldots
\end{displaymath}


\begin{displaymath}
\ldots \longrightarrow (2, \prod_{k=3}^n k)
\longrightarrow (1, \prod_{k=2}^n k) \longrightarrow (0,
\prod_{k=1}^n k)
\end{displaymath}

Au moment où la condition d'arrêt est vérifiée, le paramètre $r$ contient la valeur $\prod_{k=1}^n k$, à savoir $n!$. On se sert de l'accumulateur pour fabriquer le résultat. Démontrons par récurrence sur $n$ que $factorielleT(n, r) = r(n!)$ :

On en déduit qu'en posant $r = 1$, on a $factorielleT(n, 1) = n!$ On encapsule $factorielleT$ dans le sous-programme $factorielle$ que l'on redéfinit de la sorte :


\begin{algorithm}[H]
\dontprintsemicolon
\Fonction{$factorielle(n)$}
{
\Retourner{$factorielleT(n, 1)$}
}
\end{algorithm}



klaus 2010-08-05