Informatique


La récursivité

Aller à

La récursivité stricte

La récursivité stricte consiste en une fonction s'appelant elle-même.
L'appel de la fonction se fait donc au sein de sa propre déclaration.

Exemple: calcul d'un factoriel

Démo
<h2>Factoriel d'un nombre</h2>
<script>
var result,val;
val=0;
	function factoriel(val)
	{
	// On rejette les négatifs
		if (val < 0) {
			return -1;
		}
		// On traite le cas du zéro
		else if (val === 0) {
			return 1;
		}
		// On calcul le factoriel avec une fonction récursive
		else {
			return (val * factoriel(val - 1));
		}
	}
var result = factoriel(val);
document.write("Factoriel de ",val,": "+result);
</script>
Le return n'est effectivement appliqué que lorsque l'expression qui le suit a été complètement exécutée.

Donc, avant l'exécution effective du return on va avoir:

5 * factoriel(4)
5 * 4 * factoriel(3)
5 * 4 * 3 *factoriel(2)
5 * 4 * 3 * 2 *factoriel(1)
5 * 4 * 3 * 2 * 1 factoriel(0)
5 * 4 * 3 * 2 * 1 * 1      --> L'expression étant totalement exécutée, le return peut être appliqué.

Le dernier 1 provient du return 1 de quand on appel la fonction factorielen passant la valeur 0 !


La récursivité apparente

La récursivité apparente consiste en une fonction appelée à l'extérieur de sa propre déclaration mais plusieurs fois de suite au moyen d'un timer.
La méthode setInterval()

La méthode setInterval() appelle une fonction après un temps donné t donné en millisecondes.

setInterval(function, milliseconds)

Afficher l'heure
Démo
	<h2>Afficher l'heure</h2>
	<div id="divHeure"> </div> 
	<script type="text/javascript"> 
		function AffichageHeure(){ 
		var madate = new Date(); 
		var monheure = madate.toLocaleTimeString(); 
		document.getElementById('divHeure').innerHTML = monheure; 
		} 
	setInterval("AffichageHeure()", 1000); 
	</script>
La méthode clearInterval()

La méthode clearInterval(myvar) stoppe l'appel de la méthode stockée dans la variable myvar.

clearInterval(myvar)

Dans l'exemple suivant on stocke la fonction Affic_rebours() dans la variable cr, ceci ne doit en aucun cas vous perturber, en JavaScript une fonction est un type object.

Si on stocke cette fonction dans une variable c'est surtout pour pouvoir stopper son exécution avec clearInterval().

Un compte à rebours
Démo
	<h2>Un compte à rebours</h2>
	<div id="c_rebours"> </div> 
	<script type="text/javascript"> 
	var cr, depart;
	depart=10;
		function Affic_rebours(){ 
			if(depart>0){
			document.getElementById('c_rebours').innerHTML = depart; 
			depart--;
			}
			else{
			   clearInterval(cr);
			 }
		} 
	cr=setInterval("Affic_rebours()", 1000); 
	</script>
Un compte à rebours déclenché avec un bouton
Démo
	<h2>Un compte à rebours déclenché avec un bouton</h2>
	<div id="c_rebours"> </div> 
	<button onclick="cr=setInterval('Affic_rebours()', 1000)";>Démarrer</button>
	<script type="text/javascript"> 
	var cr, depart;
	depart=10;
	function Affic_rebours(){ 
	   if(depart>0){
		document.getElementById('c_rebours').innerHTML = depart; 
		depart--;
	   }
	   else{
		document.getElementById('c_rebours').innerHTML = depart; 
		clearInterval(cr);
		depart=10;
		 }
	} 
	</script>

On analyse:

  • on utilise l'événement onclick pour déclencher la fonction Affic_rebours()
  • lorsque la valeur de départ atteint 0 on écrit 0 à l'écran, on stoppe l'exécution de Affic_rebours() et réinitialise depart avec la valeur 10
  • la valeur départ ayant été réinitialisée l'utilisateur peut réutiliser le compte à rebours