Vous êtes sur la page 1sur 8

LA RECURSIVITE

Une fonction rcursive est une fonction rcursive contient un ou plusieurs paramtres qui voluent lorsquon rappelle la fonction jusqu' satisfaire un test qui nous permettra de sortir de la fonction. Cette manire de programmer est propre et simplifie parfois normment le code. qui sappelle elle-mme. Une fonction
Exemple function rcurssive(paramtre){ if (paramtre==1) STOP function rcurssive else rcurssive(paramtre-1) }

Premier exemple : On dfinit la factorielle de la manire suivante : . Pour calculer ce produit, on peut imaginer deux algorithmes bien diffrents, un algorithme itratif et un algorithme rcursif.
Factorielle itrative var res=1 function factorielle(n){ for(var i==2;i<n+1;i++){ res=res*i } return res } Factorielle rcurssive function factorielle(n){ if (n==0) return 1 else return n*factorielle(n-1) }

Exercice 1 Implmenter de manire rcursive la fonction factorielle(n) vue cidessus. Trouver une procdure rcursive pour implmenter une fonction somme(a,b) qui retourne la somme . Exercice 2 : La rcursivit toujours efficace ? Les nombres de Fibonacci sont dfinis ainsi : avec et . Ecrire un algorithme rcursif et un algorithme itratif qui retourne me le n nombre de Fibonacci. Comparer les deux algorithmes en crivant une fonction temps(n) qui retourne le temps de calcul des deux algorithmes. Crer un tableau qui compare les rsultats pour . Conclusion. Exercice 3 : Les chaines de caractres Les fonctions rcursives sont trs utiles pour crer de petites fonctions sur les chaines de caractres.

page 1/8

Ecrire une fonction inverseChaine(chaine) qui retourne la variable chaine lenvers. Par exemple, inverseChaine(Informatique) retourne euqitamrofnI Un palindrome est une chaine de caractre qui peut se lire aussi bien dans un sens que dans un autre. Par exemple, la chaine xamax est un palindrome car xamax= inverseChaine(xamax). Ecrire une fonction estPalindrome(chaine) qui retourne true si la variable chaine est un palindrome et qui retourne false si la variable chaine nest pas un palindrome. Exercice 4 : les anagrammes Les anagrammes de la chaine de caractre abc sont abc, acb, bac, bca, cab et cba . Il sagit de toutes les permutations que lon peut gnrer partir de la chaine de caractre abc . Supposons que lon cherche crire une fonction anagramme(chaine) qui nous retourne tous les anagrammes dune chaine. Une premire solution ce problme est propose ci-dessous. Il sagit dune solution itrative pour une chaine de longueur 3 qui contient 3 caractres diffrents.
function anagramme(chaine){ var grandDebut,grandReste, petitDebut, petitReste, var anagrammes="" if(!(chaine.length==3)) return "mot de longueur 3 SVP" else { for (var i=0; i<3; i++) { grandDebut=chaine[0] grandReste=chaine.substring(1,3) chaine=grandReste for (var j=0; j<2; j++) { petitDebut=chaine[0] petitReste=chaine.substring(1,2) chaine=petitReste for (var k=0; k<1; k++) { anagrammes=anagrammes +grandDebut + petitDebut+ chaine + "*" } chaine=petitReste+petitDebut } chaine=grandReste+grandDebut } return anagrammes } }

page 2/8

Indication, la fonction chaine.substring(a,b) retourne une sous chaine de chaine qui commence en a. Le caractre indic par largument b ne fait pas partie de la sous chaine. Lide de ce programme ci-dessus est la suivante : la premire boucle gnre les rotations gauche du mot abc cest--dire on gnre les mots bca et bca . Pour le mot abc , la deuxime boucle gnre la rotation gauche de la sous chane bc de abc . On fait de mme pour les deux autres mots. Comprendre et implmenter lalgorithme ci-dessus, puis, partir du programme propos ci-dessus, crire un algorithme rcursif qui trouve tous les anagrammes dune chaine de longueur n Exercice 5 : Parcours dun tableau 10x10 dans la diagonale. Le programme ci-dessous cr de manire dynamique un tableau de taille 10x10 lorsquon appuie sur le bouton Clic . Lorsquon appuie sur une case du tableau, la fonction diagonaleDescendante(i,j,initI,initJ) est appele.
function diagonaleDescendante(i,j,initI,initJ){ } function execute(){ var id var x="<table border='1'width='150px' height='150px'>" for (var i=0;i<10;i++){ x=x+"<tr>" for( var j=0;j<10;j++){ id=i+""+j x=x+"<td id="+id+" onclick= ' diagonaleDescendante("+i+","+j +","+i+","+j+")'>&nbsp</td>" } x=x+"</tr>" } x=x+"</table>"document.getElementById('tableau').innerHTML=x } <body> <button onclick='execute()'>Clic</button> <div id="tableau"></div> </body>

page 3/8

Complter

rcursive diagonaleDescendante(i,j,initI,initJ) afin que lorsquon appuie sur une case du tableau, la diagonale descendante depuis la case presse se colorie en rouge. Lors de lappel rcursif, les variables i et j doivent voluer dans la diagonale du tableau. Les variables initI, initJ gardent en mmoire la case du tableau qui a t coche. Ces 2 dernires variables seront utiles pour la suite de lexercice. Amliorer cette fonction afin que toute la diagonale se colorie en rouge et chaque case colorie affiche les valeurs de i et de j. La fin des appels rcursifs se fera lorsque ((initI==i)&&(initJ==j)) Amliorer la procdure afin dtendre le rsultat la partie suprieure de la diagonale. Finalement tendre le rsultat tout le tableau. Amliorer la procdure afin quun temps dattente de 200 ms sajoute entre chaque coloriage de case. Indication : Pour crer un temps dattente de 200 ms dans le programme, on peut utiliser linstruction suivante :
setTimeout("nomFonction ("+nomVar+",...,"+ nomVar +")",200)

la

fonction

Exercice 6 : Labyrinthe Le but de cet exercice est de crer, laide de la balise canvas, une procdure rcursive qui nous dessine le labyrinthe ci-contre. Le bouton Labyrinthe gnre le labyrinthe. La liste droulante permet de choisir le nombre tours (la profondeur) que notre labyrinthe doit avoir.

page 4/8

Exercice 7 : Flocon de von Koch Une fractale est obtenue en itrant linfini une opration sur un objet de base. Lune des premires fractales obtenues est le flocon de von Koch. Elle a t obtenue en 1906 par le mathmaticien sudois Helge von Koch (1870-1924). Pour construire ce flocon, il suffit de tracer un triangle quilatral, puis de remplacer le tiers mdian de chaque ct du triangle par un autre triangle quilatral. Il suffit alors de continuer la procdure jusqu linfini et on obtient le flocon de von Koch.

Pour chaque segment du triangle, les sommets et du triangle suivant peuvent se calculer de la manire suivante :
,

function dessiner(a,b,n){ if (n==0) dessiner ab else { calculer c,d,e dessiner(a,c,n-1) dessiner(c,e,n-1) dessiner(e,d,n-1) dessiner(d,b,n-1) } Lalgorithme ci-contre est un algorithme } rcursif qui peut tre utilis pour dessiner }

un segment du flocon de von Koch Implmenter un algorithme qui nous permette de dessiner le flocon de von Koch. Lutilisateur doit pouvoir choisir la complexit du flocon, cest dire le nombre ditration (variable n de la fonction dessiner) que lon doit effectuer sur un segment. Commencer par crer lalgorithme qui gnre une partie du flocon sur un seul segment du triangle puis gnraliser votre programme afin que le dessin se produise sur les 3 cts du triangle quilatral.

page 5/8

Exercice 8: Algorithmes de tri. Il existe plusieurs algorithmes diffrents qui trient les lments dun tableau. Certains algorithmes sont rapides, dautres plutt lents. Les procdures sont parfois function sommeCarrs(tab){ var som=0 itratives, dautres au contraire sont for (i=0;i<tab.length;i++){ rcursives. som=som+tab[i]* tab[i] On classe les algorithmes selon leur } complexit. La complexit algorithmique return som permet de mesurer les performances dun } algorithme et de les comparer avec dautres algorithmes ralisant les mmes fonctionnalits. Par exemple, on dit que dans lexemple ci-dessus (algorithme qui retourne la somme des carrs dun tableau) la complexit de lalgorithme est de function maFonction(tab){ car pour un tableau de longueur var som=0 il y a oprations. Le deuxime for (i=0;i<tab.length;i++){ exemple est un exemple fictif. Pour for (j=0;j<tab.length;i++){ som=som+tab[i]* tab[j] un tableau de longueur , lalgorithme maFonction(tab) fait } oprations donc on pourrait } dire que la complexit de for (k=0;k<tab.length;i++){ lalgorithme est de . Quand som=som+tab[k] tend vers linfini, est } ngligeable par rapport , on dit alors que la complexit de return som lalgorithme maFonction(tab) est de } . Le but de cet exercice est de comparer diffrents algorithmes de tri dun tableau. Le tri par insertion parcourt le tableau du dbut la fin et insert un lment directement sa place. Lalgorithme ci-contre est une solution itrative du tri par insertion. Quelle est la complexit de cet

function inserer (tableau,position) { var j=position var k=tableau[position] while ((j>0)&&(tableau[j-1]>k)) { tableau[j]=tableau[j-1] j-- } tableau[j]=k } function triInsertionIteratif(tableau){ for (var i=1; i<tableau.length; i++) { inserer(tableau,i) } }

page 6/8

algorithme dans le pire cas ? Implmenter cet algorithme de manire rcursive. Afficher ltat du tableau chaque fois que vous effectuez un tri. Le principe du tri par slection est le suivant : Rechercher le plus petit lment du tableau et lchanger avec le premier lment du tableau. Rechercher le second plus petit lment du tableau et lchanger avec le deuxime lment du tableau. Continuer jusqu ce que le tableau soit tri. Implmenter cet algorithme de manire itrative et rcursive. Afficher ltat du tableau chaque fois que vous effectuez un tri. Quelle est la complexit de cet algorithme dans le pire cas ? Lide du tri bulle est la suivante : Comparer deux lments conscutifs et dun tableau et effectuer la permutation si . Continuer de trier jusqu' ce quil ny ait plus de permutation. Implmenter cet algorithme. Afficher ltat du tableau chaque fois que vous effectuez un tri. Quelle est la complexit de cet algorithme dans le pire cas ?

Le tri rapide est un algorithme de tri plus performant invent par Charles Antony Richard Hoare en 1961. La mthode est la suivante. Choisir un lment que lon appelle function triRapide(tableau, premier, dernier){ pivot (par var pivot if (premier<dernier) { exemple pivot = partition(tableau,premier,dernier) premier triRapide(tableau,premier,pivot-1) lment de la triRapide(tableau,pivot+1,dernier) liste) et placer } tous les } lments infrieurs au pivot sur la gauche du tableau. Relancer lalgorithme sur les lments gauche du pivot et les lments droite du pivot. Complter lagorithme ci-dessus en crivant la fonction partition(tableau,premier,dernier) qui retourne la position du pivot aprs avoir mis les lments plus petits que le pivot gauche du pivot et les autres lments droite du pivot. Quelle est la complexit dans le pire cas de cet algorithme ? Exercice 9: Tri par insertion. Visualisation graphique laide de canvas. Nous allons reprsenter graphiquement un tableau laide de canvas puis le trier laide dun tri par insertion. A chaque modification du tableau, nous allons rafficher les composantes du tableau afin de crer une petite animation. Tlcharger le template ci-dessous et le complter. Suivre les commentaires lintrieur du template.

page 7/8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>RECURSIF/animation tri</title> <script type="text/javascript"> // _____ INITALISATION _______ var tableau, canvas, ctx, t1, iT; function initTableau(taille){ // remplir le tableau de manire alatoire les nombres entre 0 et 50 } function init() { ctx=document.getElementById('canvas').getContext('2d') tableau=initTableau(50) } // _____ AFFICHAGE _______ function dessin (tab) { // effacer le canvas et parcourir tab[i], dessiner P(i*10,tab[i]*10) } function afficheTableau(tab){ ctx.clearRect(0, 0, 500 , 500); ctx.beginPath(); dessin(tab) ctx.closePath(); } // _____ INSERTION _______ function inserer (tab,position) { var j=position var k=tab[position] while ((j>0)&&(tab[j-1]>k)) { tab[j]=tab[j-1] j-- } tab[j]=k return tab } function triIter() { if(iT<t1.length) { t1=inserer(t1,iT) iT++ dessin(t1) setTimeout(triIter,100); } } function triInsertionIteratif(t){ t1=t iT=0 setTimeout(triIter,100); } </script> </head> <body onload="init()"> <button onclick="afficheTableau(tableau);triInsertionIteratif(tableau)"> trier graphique de ce tableau</button><br/> <canvas id="canvas" width="500" height="500" style="border: medium solid rgb(255,0,0)"></canvas> </body> </html>

page 8/8