RECURSIVITE Exercices - Corrigés Exercice - U calcul très classique Ecrire ue foctio Pytho qui calcule la somme des iverses des carrés des premiers etiers aturels o uls. O pourra esuite écrire u script plus complet qui, après le calcul précédet, évalue et affiche π l écart (e %) avec la limite de cette somme qui vaut (rappel : le ombre π e fait pas 6 partie itégrate du cœur du du lagage Pytho. O importera doc pi via la bibliothèque math : from math import pi). O cherche ici à calculer, pour tout etier aturel o ul : S =. i= i π O rappelle que l o a : lim S = lim =. i 6 + + i = Le cas de base est celui où la somme e comporte qu u terme ( e l occurrece) : S =. C est doc le cas où il y aura pas d appel récursif. O a alors : def sum_sq_iv(): if == : retur retur /** + sum_sq_iv(-) Evidemmet, lors de l appel iitial à cette foctio, o devra s être assuré, d ue faço ou d ue autre, que l argumet est bie u etier aturel o ul. C est pourquoi, das le programme (script) ci-après, le bloc d istructios suivat a été ajouté : = 0 while < : = it(iput('nombre de termes? ')) Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [-7] Marc Lichteberg
Si o souhaite cepedat effectuer les tests das la foctio elle-même (ce est pas ue très boe idée car cela géère de trop ombreux tests iutiles!), o pourra utiliser le code suivat : def sum_sq_iv(): if type()!= it: raise TypeError('Vous devez fourir u etier!') elif <= 0: raise ValueError('Vous devez fourir u etier aturel o ul!') if == : retur retur /** + sum_sq_iv(-) Voici u script possible : # La foctio récursive pour le calcul de la somme propremet dit. def sum_sq_iv(): if == : retur retur /** + sum_sq_iv(-) # DEBUT DU SCRIPT # =============== # Importatio de pi from math import pi # Nombre de termes de la somme. = 0 while type()!= it or < : = it(iput('veuillez saisir le ombre de termes (etier aturel o ul) à sommer? ')) # Calcul de la somme. r = sum_sq_iv() # Erreur relative commise (pourcetage). error = 00 * (6 * r / pi** - ) # Affichage des résultats. prit('la somme des iverses des carrés des '+str()+ ' premiers etiers aturels o uls vaut : '+str(r)) prit('l\'erreur commise vaut '+str(error)+' %.') # FIN DU SCRIPT # ============= Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [-7] Marc Lichteberg
Exercice Ue foctio mystérieuse? def dk(l,l=[]): if L == []: retur L s = L.pop(0) if s ot i L: L.apped(s) retur dk(l,l) Que reverra la foctio dk défiie ci-dessus lorsqu o l appelle comme suit? dk([34,,3,,,,34,7,,7,7,,3,]) Comme suggéré e séace, faire «tourer u algorithme à la mai» est très formateur! Que vous ayez agi de la sorte ou e écrivat rapidemet la foctio ci-dessus sous IDLE (ou équivalet), vous avez rapidemet réalisé que la foctio dk élimiait «simplemet» les élémets redodats de la première liste passée e argumet tout e costruisat ue deuxième liste correspodat à L privée des élémets redodats. Aisi, la foctio dk supprime les doublos, c est ue «doublos killer». L appel dk([34,,3,,,,34,7,,7,7,,3,]) reverra doc la liste : [34,, 3,, 7, ]. Exercice 3 Le compte est-il bo? Ecrire ue foctio Pytho «compte_a» qui reçoit comme argumet ue chaîe de caractères (évetuellemet vide) et revoie le ombre de «a» qu elle cotiet. La chaîe passée e argumet peut coteir des lettres majuscules. O pourra souhaiter trasformer la chaîe e ue chaîe e coteat que des miuscules (à vous de trouver la méthode qui réalise très bie cette trasformatio). Pourquoi est-il pas pertiet d utiliser cette méthode das votre foctio? Vous pourrez tester votre foctio avec les chaîes suivates :, sphix, abracadabra et automorphisme. Ue chaîe de caractère o vide est rie d autre qu u premier caractère précédat ue autre chaîe de caractère (évetuellemet vide)! Et voilà otre pricipe de récurrece quasimet e place! Le cas de base correspod à ue chaîe de caractère vide. Pour coder le pricipe précédet, il coviet de rappeler que les chaîe de caractères sot idexables comme les listes (mais les méthodes classiques des listes e sot pas dispoibles). Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [3-7] Marc Lichteberg
O peut doc simplemet accéder à u caractère quelcoque d ue chaîe de caractères via so idice (comme pour ue liste, le premier caractère est d idice ul) et o peut égalemet accéder à ue «sous-chaîe» de caractères. Aisi, si o appelle s ue chaîe de caractères o vide, o accèdera à so premier caractère grâce à s[0] et la chaîe s privée de so premier caractère s obtiet grâce à s[- :]. O obtiet alors la foctio : def compte_a(s): if type(s)!= str: raise TypeError('Vous devez fourir ue chaîe de caractères!') elif le(s) == 0: retur 0 = compte_a(s[:]) if s[0] == 'a': += retur Exercice 4 Ses dessus dessous Ecrire ue foctio Pytho permettat de détermier si ue chaîe de caractères est ou o u palidrome (i.e. pouvat être lue idifféremmet de la gauche vers la droite ou de la droite vers la gauche). La démarche géérale cosiste à comparer les caractères situés aux extrémités de la chaîe. E otat s la chaîe de caractères, o testera doc s[0] et s[-]. O poursuit cette comparaiso sur la ouvelle chaîe obteue e «amputat» la chaîe courate des deux caractères précédets tat que les deux caractères testés sot idetiques. Cette «amputatio» cosiste à coserver la sous-chaîe : s[:-]. Pour ce qui est du cas de base, deux situatios sot à predre e compte : celle d ue chaîe de caractères vide et celle d ue chaîe e comportat qu u seul caractère. D où la foctio palidrome qui, otos-le, revoie u boolée. def palidrome(s): if le(s) == 0 or le(s) == : retur True if s[0]!= s[-]: retur False retur palidrome(s[:-]) Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [4-7] Marc Lichteberg
Exercice 5 Ue bijectio de das Ci-après, ue représetatio de la foctio de couplage de Cator qui établit ue bijectio de das (les couples d etiers aturels sot représetés e bleu et les etiers associés e blac sur fod oir). O a par exemple, e otat f la foctio : f (,) = 4 et ( ) f, 3 = 3. Ecrire ue foctio récursive qui permet de calculer f ( xy, ) pour tout couple (, ) aturels. x y d etiers Graphiquemet parlat, l observatio des segmets rouges ous coduit à distiguer deux situatios pricipales selo que y est ul ou pas : y = (x état o ul), le couple qui précède le couple (,0) ( 0, x ). Das ce cas, o aura doc : f ( x,0) = f ( 0, x ) +. y (c est le cas gééral), le couple qui précède le couple (, ) ( x+, y ). Das ce cas, o aura : f ( x, y) = f ( x+, y ) +. Si 0 Si 0 A partir du cas gééral, o a l echaîemet : x est le couple x y est le couple ( x, y) ( x+, y ) ( x+, y )... ( x+ y, 0) ( 0, x+ y ) Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [5-7] Marc Lichteberg
Puis : ( 0, x+ y ) (, x+ y ) (, x+ y 3 )... ( x+ y,0) ( 0, x+ y ) E poursuivat de la sorte, o a les couples itermédiaires ( x+ y 3, 0), ( x y 4, 0) O fiit par aboutir au couple ( 0, 0 ) qui correspod à otre cas de base, écessaire pour programmer otre foctio récursive que ous baptisos simplemet um : def um(x,y): if x == 0 ad y == 0: retur 0 elif y == 0: retur + um(0,x-) retur + um(x+,y-) +, etc. A partir de la démarche ci-dessus, o peut doer ue défiitio explicite de la foctio f. E effet, l echaîemet : ( x, y) ( x+, y ) ( x+, y )... ( x+ y, 0) ( 0, x+ y ) ous doe : f ( x, y) = f ( x+ y,0) + y et f ( x+ y,0) = f ( 0, x+ y ) + d où : ( ) ( ) f x, y = f 0, x+ y + y+ D où : (, ) = ( 0, + ) + + = f ( x+ y, 0) + ( x+ y ) + y+ = f ( 0, x+ y ) + ( x+ y) + y+ ( ) ( ) ( ) ( ) ( ) ( ) f x y f x y y = f x+ y, 0 + x+ y + x+ y + y+ = f 0, x+ y 3 + x+ y + x+ y + y+ =... ( ) ( ) ( ) = f 0, 0 + + 3 +... + x+ y + x+ y + y+ = 0 3... ( ) ( x+ y)( x+ y+ ) = + + + + x+ y + y = + y Fialemet : (, ), (, ) ( x+ y)( x+ y+ ) x y f x y = + y Il reste à s assurer que la foctio f est bie ue bijectio de das Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [6-7] Marc Lichteberg
Exercice 6 Les tours? C est carré! Ecrire ue foctio Pytho permettat de placer tours sur u échiquier x de sorte qu aucue e soit e prise avec ue autre (le programme devra détermier toutes les cofiguratios possibles et o affichera chacue des cofiguratios. ATTENTION! Il y e a beaucoup! Et d ailleurs, vous savez très bie combie ). O peut adopter diverses approches. Le cœur du programme que je vous fouris sur votre page est la foctio récursive Place qui reçoit e argumet u etier correspodat au ombre de tours restat à placer. Le premier appel de Place se fait doc avec la taille de l échiquier comme argumet. U appel courat de Place est de la forme Place(N). O cherche alors à placer ue tour das la coloe -N. Pour cela, o balaie toutes les cases (i,-n) avec i variat de 0 à - et dès que l ue d elle est pas e prise o y place ue tour, o met esuite à jour l échiquier car cette ouvelle tour placée egedre des cases e prise et, efi, o appelle récursivemet Place avec N- comme argumet (si N est différet de bie sûr ). Avec cette approche, o maipule de ombreux tableaux umpy, tous de même dimesio. Pour fiir, il y a bie sûr! solutios. (le problème reveat à détermier toutes les permutatios de ; ). Féelo Saite-Marie 07-08 MP/PC-PC*/PSI* [7-7] Marc Lichteberg