var factoriel:Function = function( n:Number ):Number 
{
	if ( n <= 1 )
	{
		return 1 ;
	}
	else
	{
		return n * factoriel(n-1) ;
	}
}
 
trace( factoriel(10) ) ;
trace( factoriel(255) ) ;
trace( factoriel(256) ) ;

Nous obtenons dans le panneau de sortie de Flash :

3628800
Infinity
256 levels of recursion were exceeded in one action list.
This is probably an infinite loop.
Further execution of actions has been disabled in this movie.

La limite de récursion en AS1/AS2 est donc très vite atteinte. L'idée à la base était que l'ActionScript (comme le Javascript) étaient des langages qui ne nécessités pas une aussi forte sollicitation algorithmique. De façon générale les langages basés sur les normes ECMAScript préfèrent l'utilisation d'algorithmes itératifs que récursifs.

A noter qu'il est possible de changer le nombre de récursions ainsi que le temps maximum d'exécution d'un script en AS1 ou AS2 avec un utilitaire externe en ligne de commande : SWF ScriptLimits Injector. Cet utilitaire fonctionne avec un swf au format FP7 et + (je ne l'ai pas testé avec un code en AS3 ?)

Maintenant que nous avons vu qu'il existe une limite dans l'AVM1 (virtual machine du FlashPlayer en AS1 et l'AS2), il est temps de voir ce qu'il se passe dans Flash CS3 en AS3 avec un bout de code super simple

var cpt:Number = 0 ;
 
var max:Number = 3035 ;
 
var test:Function = function()
{
	cpt++ ;
	if ( cpt < max )
	{
		test() ; 
	}
}
 
test() ;
 
trace(cpt) ; // 3035

Avec le code ci-dessus nous obtenons un résultat évidant, avec une valeur 3035 dans le panneau de sortie. Première constatation, nous pouvons dépasser dans Flash CS3 la limite de 255 récursions et donc il est possible d'aller bien au delà !

Voyons maintenant le même script mais avec une valeur maximale de 3036 :

var cpt:Number = 0 ;
 
var max:Number = 3036;
 
var test:Function = function()
{
	cpt++ ;
	if ( cpt < max )
	{
		test() ; 
	}
}
 
test() ;
 
trace(cpt) ; // Error...

Nous obtenons une erreur dans le panneau de sortie de Flash :

Error: Error #1023: Il s'est produit un débordement de pile.
 	at MethodInfo-1()
 	at MethodInfo-1()
 	at MethodInfo-1()
 	at MethodInfo-1()
 	at MethodInfo-1()
 	at MethodInfo-1()
 	at MethodInfo-1()
        ....

Par défaut dans Flash CS3 nous avons donc une limite du nombre de récursions avec 3035 récursions possibles.

A noter que dans le compilateur de Flex (mxmlc.exe) il est possible de changer via une commande le nombre limite de récursion du swf compilé :

-default-script-limits <max-recursion-depth> <max-execution-time>

Pour plus d'informations à ce sujet vous pouvez consulter la documentation de Flex ou le très bon article sur senocular.com : Beginners Guide to Getting Started with AS3 (Without Learning Flex)

Je n'ai pas encore trouvé comment... mais je me demande si il est possible de faire de même avec Flash CS3 ?

Pour toutes vos questions sur cet article vous pouvez utiliser les commentaires de ce blog mais je vous propose d'aller discuter sur le Google Groups de mon blog.