{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# La récursivité" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Principe général" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La récursivité s'utile dans les fonctions ou les procédures et utilise le principe suivant :\n", "\n", "dans un calcul d'une quantité dépendant de la variable **entière** $n$, quantité que l'on note $u_n$, si l'on connaît la valeur de $u_0$ et que pour tout $n\\in \\mathbb{N}^*$, on peut exprimer la quantité $u_n$ à l'aide des quantités $u_0,\\cdots,u_{n-1}$, alors on connaîtra également la quantité $u_n$.\n", "\n", "La particularité d'une fonction récursive est qu'elle s'**auto-appelle**, c'sst-à-dire que dans le corps de la fonction figure un appel de cette même fonction mais à un cran strictement supérieur.\n", "\n", "Le principe de récursivité s'inscrit donc dans des schémas de **récurrences descendantes** : on peut exprimer une certaine propriété ${\\cal P}(n)$ à l'aide des propriétés ${\\cal P}(k)$, avec $0\\leq k\\leq n-1$ et la propriété d'initialisation ${\\cal P}(0)$ est vraie. On peut donc rencontrer des récursivités ordinaires, mettant en jeu des récurrences descendantes où la propriété ${\\cal P}(n)$ dépend uniquement de lapropriété ${\\cal P}(n-1)$, des récursivités doubles et des récursivités fortes.\n", "\n", "\n", "Si à un moment donné, la fonction récursive $F(n)$ utilise un appel de $F(k)$, avec $k$ non strictement inférieur à $n$, alors la récursivité plante, car la récurrence ne s'arrête jamais (soit elle stagne, soit elle diverge vers $+\\infty$.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exemples de fonctions récursives" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Récursivité simple" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Fact_Recursif(n) :\n", " \"\"\" calcule récursivement la factorielle \"\"\"\n", " if n==0 :\n", " return 1\n", " else :\n", " return n*Fact_Recursif(n-1)\n" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Factorielle de 0 égale à : 1\n", "Factorielle de 1 égale à : 1\n", "Factorielle de 2 égale à : 2\n", "Factorielle de 3 égale à : 6\n", "Factorielle de 4 égale à : 24\n", "Factorielle de 5 égale à : 120\n", "Factorielle de 6 égale à : 720\n", "Factorielle de 7 égale à : 5040\n", "Factorielle de 8 égale à : 40320\n", "Factorielle de 9 égale à : 362880\n", "Factorielle de 10 égale à : 3628800\n", "Factorielle de 11 égale à : 39916800\n", "Factorielle de 12 égale à : 479001600\n", "Factorielle de 13 égale à : 6227020800\n", "Factorielle de 14 égale à : 87178291200\n", "Factorielle de 15 égale à : 1307674368000\n", "Factorielle de 16 égale à : 20922789888000\n", "Factorielle de 17 égale à : 355687428096000\n", "Factorielle de 18 égale à : 6402373705728000\n", "Factorielle de 19 égale à : 121645100408832000\n" ] } ], "source": [ "for k in range(20) :\n", " print(\"Factorielle de \",k,\" égale à : \",Fact_Recursif(k))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Récursivité multiple" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [], "source": [ "\n", "def Fibo_Recursif(n) :\n", " \"\"\" calcule récursivement les termes de la suite de Fibonacci \"\"\"\n", " if n <= 1 :\n", " return 1\n", " else :\n", " return Fibo_Recursif(n-1)+Fibo_Recursif(n-2)\n", " " ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Terme d'indice 0 de Fibonacci : 1\n", "Terme d'indice 1 de Fibonacci : 1\n", "Terme d'indice 2 de Fibonacci : 2\n", "Terme d'indice 3 de Fibonacci : 3\n", "Terme d'indice 4 de Fibonacci : 5\n", "Terme d'indice 5 de Fibonacci : 8\n", "Terme d'indice 6 de Fibonacci : 13\n", "Terme d'indice 7 de Fibonacci : 21\n" ] } ], "source": [ "for k in range(8) :\n", " print(\"Terme d'indice \",k,\" de Fibonacci :\",Fibo_Recursif(k))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recursivité forte" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exemple 1 : une fonction Cardinal" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Cardinal(L) :\n", " \"\"\" calcule le nombre d'occurrences différentes dans une liste L \"\"\"\n", " if L==[] :\n", " return 0\n", " else :\n", " return 1+Cardinal([x for x in L if x!=L[0]])" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "La liste L est égale à : ['b', 'o', 'n', 'j', 'o', 'u', 'r', ' ', 't', 'o', 'u', 't', ' ', 'l', 'e', ' ', 'm', 'o', 'n', 'd', 'e'] de cardinal : 12 .\n" ] } ], "source": [ "L=list(\"bonjour tout le monde\")\n", "print(\"La liste L est égale à : \",L,\" de cardinal :\",Cardinal(L),\".\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exemple 2 : l'exponentiation rapide" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "x=np.pi\n", "def Expo_Recursif(x,n) :\n", " \"\"\" calcule x**n par récursivité \"\"\"\n", " if n==0 :\n", " return 1\n", " else :\n", " if n%2==0 :\n", " val_Temp=Expo_Recursif(x,n//2)\n", " return val_Temp*val_Temp\n", " else :\n", " val_Temp=Expo_Recursif(x,(n-1)//2)\n", " return (x*val_Temp*val_Temp)\n" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pi a la puissance 0 égal à : 1\n", "Pi a la puissance 1 égal à : 3.141592653589793\n", "Pi a la puissance 2 égal à : 9.869604401089358\n", "Pi a la puissance 3 égal à : 31.006276680299816\n", "Pi a la puissance 4 égal à : 97.40909103400243\n", "Pi a la puissance 5 égal à : 306.0196847852814\n", "Pi a la puissance 6 égal à : 961.3891935753041\n", "Pi a la puissance 7 égal à : 3020.293227776791\n", "Pi a la puissance 8 égal à : 9488.531016070572\n", "Pi a la puissance 9 égal à : 29809.099333446204\n", "Pi a la puissance 10 égal à : 93648.047476083\n", "Pi a la puissance 11 égal à : 294204.0179738905\n", "Pi a la puissance 12 égal à : 924269.1815233736\n" ] } ], "source": [ "for k in range(13) :\n", " print(\"Pi a la puissance \",k,\" égal à :\",Expo_Recursif(x,k))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exemple 3 : le compte est bon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On définit une fonction récursive simple permettant d'avoir toutes les sous-listes d'occurrences $0$ ou $1$." ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Sous_Listes(n) :\n", " \"\"\" renvoie la liste des 2**n listes de n éléments, composées de 0 et de 1 \"\"\"\n", " if n==0 :\n", " return []\n", " elif n==1 :\n", " return [[0],[1]]\n", " else :\n", " return [L+[0] for L in Sous_Listes(n-1)]+[L+[1] for L in Sous_Listes(n-1)]" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Liste des sous-listes de 0 et 1 avec 0 occurrence(s) :\n", " []\n", "Liste des sous-listes de 0 et 1 avec 1 occurrence(s) :\n", " [[0], [1]]\n", "Liste des sous-listes de 0 et 1 avec 2 occurrence(s) :\n", " [[0, 0], [1, 0], [0, 1], [1, 1]]\n", "Liste des sous-listes de 0 et 1 avec 3 occurrence(s) :\n", " [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 1], [1, 1, 1]]\n" ] } ], "source": [ "for k in range(4) :\n", " print(\"Liste des sous-listes de 0 et 1 avec \",k,\" occurrence(s) :\\n\",Sous_Listes(k)) " ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Sous_Listes_Liste(L) :\n", " \"\"\" renvoie toutes les sous-listes de liste \"\"\"\n", " n=len(L)\n", " return [[L[k] for k in range(n) if S[k]==1] for S in Sous_Listes(n)]" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[], [6], [True], [6, True], ['message'], [6, 'message'], [True, 'message'], [6, True, 'message'], [[[1], ['sous_liste']]], [6, [[1], ['sous_liste']]], [True, [[1], ['sous_liste']]], [6, True, [[1], ['sous_liste']]], ['message', [[1], ['sous_liste']]], [6, 'message', [[1], ['sous_liste']]], [True, 'message', [[1], ['sous_liste']]], [6, True, 'message', [[1], ['sous_liste']]]]\n", "Longueur égale à 16\n" ] } ], "source": [ "Resultat=Sous_Listes_Liste([6,True,\"message\",[[1],[\"sous_liste\"]]])\n", "print(Resultat)\n", "print(\"Longueur égale à \",len(Resultat))" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Prive(L,S) :\n", " \"\"\" renvoie les occurrences de L où on a enlevé les occurrences de S avec S sous_liste de L \"\"\"\n", " L_Temp=L.copy()\n", " for x in S :\n", " if x in L_Temp :\n", " L_Temp.remove(x)\n", " return L_Temp" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9, 2, 4, 3, 3]\n" ] } ], "source": [ "L=[8,9,2,3,3,4,3,3]\n", "S=[8,3,3,\"valeur\"]\n", "print(Prive(L,S))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On modélise le *compte est bon* comme un dictionnaire dont les clés sont les expressions littérales et les valeurs les résultats numériques de ces expressions littérales. " ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [], "source": [ "\n", "def Dico_Operations(L) :\n", " \"\"\" renvoie le dictionnaire des associations (operations:résultat) \"\"\"\n", " global nombre \n", " \n", " if L==[] :\n", " return {}\n", " elif len(L)==1 :\n", " return dict([(str(L[0]),L[0])])\n", " else :\n", " dico_A_Remplir={}\n", " for S in Sous_Listes_Liste(L) :\n", " if S!=L and S!=[] :\n", " T=Prive(L,S)\n", " dico_1=Dico_Operations(S) \n", " dico_2=Dico_Operations(T)\n", " ### récursivité forte : on utilise toutes les associations déjà calculées sur les sous-listes\n", " dico_A_Remplir.update(dico_1) \n", " for cle1 in dico_1.keys() :\n", " for cle2 in dico_2.keys() :\n", " x,y=dico_1[cle1],dico_2[cle2]\n", " \n", " dico_A_Remplir[\"(\" + cle1 + \")\" + \"+\" + \"(\" + cle2 + \")\"]=x+y\n", " \n", " if x-y>0 : \n", " dico_A_Remplir[\"(\" + cle1 + \")\" + \"-\" + \"(\" + cle2 + \")\"]=x-y\n", " \n", " \n", " dico_A_Remplir[\"(\" + cle1 + \")\" + \"*\" + \"(\" + cle2 + \")\"]=x*y\n", " \n", " if y!=0 and x%y==0 : # division dans les entiers\n", " dico_A_Remplir[\"(\" + cle1 + \")\" + \"/\" + \"(\" + cle2 + \")\"]=x//y\n", " \n", " return dico_A_Remplir\n", " \n", " \n", "def Compte(L,nombre) :\n", " \"\"\" renvoie une association (operation : resultat) avec resultat le plus proche de nombre \"\"\"\n", " mini=abs(nombre)\n", " Operation_A_Remplir=\"\"\n", " dico=Dico_Operations(L)\n", " for cle in dico.keys() :\n", " if abs(dico[cle]-nombre) $\\rhd$ au départ, les $n$ palets sont disposés sur la tige la plus à gauche, les palets étant disposés du plus grand (en dessous) au plus petit (au dessus de la pile).\n", "\n", "> $\\rhd$ à chaque étape de jeu, le joueur peut prendre sur l'une des tiges de son choix le palet supérieur et le poser sur une autre tige, à la condition qu'il soit placé sur une tige où il n'y a rien ou bien à condition de le poser sur un palet toujours plus gros que lui. A tout moment, il est **interdit de poser un palet sur un palet plus petit**.\n", "\n", "- but du jeu : à partir de la configuration initiale, disposer selon les règles du jeu tous les palets sur la tige de droite.\n", "\n", "Dans le script suivant, il est demandé via un widget $Entry()$ de renseigner le nombre de palets désirés, et la machine fait le reste... \n", "\n", "**Remarque** : le paramètre $Temps$ dans l'interface permet de modifier le temps écoulé entre chaque coup du joueur." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [], "source": [ "### Résolution du jeu (fonction récursive !!!) ###\n", "\n", "def Autre(D,A) :\n", " return [x for x in [1,2,3] if x!= A and x != D][0]\n", "\n", "def Tour_Hanoi(D,A,n) :\n", " if n==0 :\n", " return []\n", " else :\n", " return Tour_Hanoi(D,Autre(D,A),n-1)+[[D,A]]+Tour_Hanoi(Autre(D,A),A,n-1)\n", "\n", "\n", "### Importation des modules nécessaires ###\n", "\n", "from tkinter import *\n", "import time\n", "\n", "### Définition de certains paramètres globaux ###\n", "\n", "LX=[150,350,550]\n", "Disposition=[]\n", "Temps=10\n", "\n", "\n", "def Dessin_Jeu():\n", " canevas.create_rectangle(20,370,680,390,fill=\"#0B4C5F\",width=0)\n", " for x in LX :\n", " canevas.create_rectangle(x-5,370,x+5,100,fill=\"#0B4C5F\",width=0)\n", "\n", "def Dessin_Palet(Pic,Nombre,Numero) :\n", " \"\"\" dessins le palet numéro Numero sur le pic Pic comportant déjà Nombre palets\"\"\"\n", " global Palets_D,Palets_G,n,Hauteur,Espace\n", " \n", " Hauteur=150/n\n", " Espace=50/n\n", " Y=370-((Nombre+1)*Espace+Nombre*Hauteur)\n", " Largeur=90*(1-Numero/n)+30*Numero/n\n", " Palets_G[Numero]=canevas.create_rectangle(LX[Pic-1]-Largeur,Y,LX[Pic-1]-15,Y-Hauteur,fill=\"#00FF00\",width=2)\n", " Palets_D[Numero]=canevas.create_rectangle(LX[Pic-1]+Largeur,Y,LX[Pic-1]+15,Y-Hauteur,fill=\"#00FF00\",width=2)\n", " \n", "def Palet_Init() :\n", " global Disposition,Palets_G,Palets_D,n\n", " n=Nbre.get()\n", " n=int(n)\n", " # chaque palet sera dénommé Palet_D et Palet_G pour les parties droite et gauche. La place mémoire du palet est construite à partir de son range dans range(n).\n", " Palets_D=[0 for k in range(n)]\n", " Palets_G=[0 for k in range(n)]\n", " Hauteur=150/n\n", " Espace=50/n\n", "\n", " for k in range(n) :\n", " Dessin_Palet(1,k,k)\n", " \n", " L=list(range(n))\n", " Disposition=[L,[],[]]\n", "\n", "def Transfert(D,A):\n", " \"\"\" modélise le transfert du palet supérieur du pic D au pic A\"\"\"\n", " global Disposition,n,compteur_Coups,Palets_G,Palets_D,Temps\n", " \n", " L1=Disposition[D-1].copy()\n", " L2=Disposition[A-1].copy()\n", " Numero=L1[-1] # numéro du palet transféré\n", " \n", " \n", " Nombre=len(L1)-1 # nombre de palets sur le Pic D\n", " Nombre_A=len(L2) # nombre de palets sur le Pic A\n", " \n", " Y=370-((Nombre+1)*Espace+Nombre*Hauteur)\n", " Largeur=90*(1-Numero/n)+30*Numero/n\n", " \n", " \n", " Largeur_A=90*(1-Numero/n)+30*Numero/n\n", " Y_A=370-((Nombre_A+1)*Espace+Nombre_A*Hauteur)\n", " \n", " \n", " Texte_Coups=canevas.create_text(350,80,text=\"nombre de coups effectués : \"+str(compteur_Coups),fill=\"magenta\",font=\"Arial 16 italic\")\n", " for k in range(3) :\n", " canevas.delete(Palets_G[Numero])\n", " canevas.delete(Palets_D[Numero])\n", " \n", " Nouveau_Palet_G=canevas.create_rectangle(LX[A-1]-Largeur_A,Y_A,LX[A-1]-15,Y_A-Hauteur,fill=\"red\",width=2)\n", " Nouveau_Palet_D=canevas.create_rectangle(LX[A-1]+Largeur_A,Y_A,LX[A-1]+15,Y_A-Hauteur,fill=\"red\",width=2)\n", " fenetre.after(Temps)\n", " fenetre.update()\n", " Palets_G[Numero]=canevas.create_rectangle(LX[D-1]-Largeur,Y,LX[D-1]-15,Y-Hauteur,fill=\"#00FF00\",width=2)\n", " Palets_D[Numero]=canevas.create_rectangle(LX[D-1]+Largeur,Y,LX[D-1]+15,Y-Hauteur,fill=\"#00FF00\",width=2)\n", " canevas.delete(Nouveau_Palet_G)\n", " canevas.delete(Nouveau_Palet_D)\n", " fenetre.after(Temps)\n", " fenetre.update()\n", " \n", " \n", " canevas.delete(Palets_G[Numero])\n", " canevas.delete(Palets_D[Numero])\n", " Palets_G[Numero]=canevas.create_rectangle(LX[A-1]-Largeur_A,Y_A,LX[A-1]-15,Y_A-Hauteur,fill=\"#00FF00\",width=2)\n", " Palets_D[Numero]=canevas.create_rectangle(LX[A-1]+Largeur_A,Y_A,LX[A-1]+15,Y_A-Hauteur,fill=\"#00FF00\",width=2)\n", " L1.remove(Numero)\n", " L2.append(Numero)\n", " Disposition[D-1],Disposition[A-1]=L1.copy(),L2.copy()\n", " canevas.delete(Texte_Coups)\n", " \n", " \n", " \n", " \n", " \n", " \n", "def go() :\n", " global flag,Nbre,n,Texte_Coups,compteur_Coups,Temps\n", " n=Nbre.get()\n", " n=int(n)\n", " flag=1\n", " if flag :\n", " t_0=time.clock()\n", " Dessin_Jeu()\n", " Palet_Init()\n", " compteur_Coups=0\n", " for Coup in Tour_Hanoi(1,3,n) :\n", " compteur_Coups+=1\n", " Transfert(Coup[0],Coup[1])\n", " if not(flag) :\n", " break\n", " \n", " t_1=time.clock()\n", " for k in range(7) :\n", " \n", " Texte_Final=canevas.create_text(350,80,text=\"Jeu terminé en : \"+str(compteur_Coups)+\" coups !!! Durée : \"+ str(round(t_1-t_0,5))+\" secondes\",fill=\"magenta\",font=\"Arial 16 italic\")\n", " fenetre.after(300)\n", " fenetre.update()\n", " canevas.delete(Texte_Final)\n", " fenetre.after(300)\n", " fenetre.update()\n", " if not(flag) :\n", " break\n", " \n", " canevas.create_text(350,80,text=\"Jeu terminé en : \"+str(compteur_Coups)+\" coups !!! Durée : \"+ str(round(t_1-t_0,5))+\" secondes\",fill=\"magenta\",font=\"Arial 16 italic\")\n", " \n", " \n", " \n", "def stop() :\n", " global flag\n", " flag=0\n", "\n", "def effacer() :\n", " canevas.delete(ALL)\n", "\n", "\n", "fenetre = Tk()\n", "\n", "titre=Label(fenetre,text=\"Les Tours de Hanoï\",fg=\"red\",font=\"Arial 16 italic\")\n", "titre.pack(side=TOP)\n", "\n", "canevas = Canvas(fenetre, width =700, height =400, bg =\"#F5DA81\")\n", "canevas.pack( padx =5, pady =5)\n", "\n", "\n", "bouton_quitter = Button(fenetre, text=\"Quitter\", command=fenetre.quit)\n", "bouton_quitter.pack(side=RIGHT)\n", "\n", "\n", "\n", "b2 = Button(fenetre, text ='Stop', command =stop)\n", "b2.pack(side=RIGHT, padx =3, pady =3)\n", "\n", "\n", "b1 = Button(fenetre, text ='Go!', command =go)\n", "b1.pack(side=RIGHT, padx =3, pady =3)\n", "\n", "\n", "b0 = Button(fenetre, text ='Tout effacer', command =effacer)\n", "b0.pack(side=RIGHT, padx =3, pady =3)\n", "\n", "\n", "Texte=Label(fenetre,text=\"Nombre de plateaux :\",fg=\"blue\")\n", "Texte.pack(side=LEFT,padx=3,pady=3)\n", "\n", "Nbre=Entry(fenetre)\n", "Nbre.pack(side=LEFT,padx=3,pady=3)\n", "\n", "\n", "fenetre.mainloop()\n", "fenetre.destroy()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Avantages et inconvénients de la récursivité" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Avantages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La récursivité permet d'obtenir des scripts condensés. De plus, si l'on a une quantité à calculer en fonction de donnnées antérieures, la récursivité se prête bien à son implémentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inconvénients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un inconvénient est que la concision du script peut parfois cacher une complexité de calcul importante.\n", "\n", "Entre une fonction itérative et une fonction récursive calculant la même chose, ce n'est pas toujours la fonction récursive qui est la plus efficace..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calculs de complexité : comparaison récursif et itératif" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le calcul de complexité d'une fonction récursive est assez simple à calculer. Si $c_n$ est la complexité de calcule d'une fonction récursive $F(n)$, selon la formule de récursivité utilisée dans la fonction on obtient une formule de récurrence (pas forcément linéaire) exprimant $c_n$ à l'aide des complexités de calculs de $c_k$ (si le calcul de $F(n)$ fait intervenir des $F(k)$)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fonction de comparaison des temps de calculs" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pylab import *\n", "\n", "import time\n", "\n", "def Traces_Comp(F_Ite,F_Rec,n) :\n", " LX=list(range(n+1))\n", " LT_ite,LT_rec=[],[]\n", " for k in LX :\n", " t_0=time.clock()\n", " F_Ite(k)\n", " t_1=time.clock()\n", " LT_ite.append(log(t_1-t_0))\n", " for k in LX :\n", " t_0=time.clock()\n", " F_Rec(k)\n", " t_1=time.clock()\n", " LT_rec.append(log(t_1-t_0))\n", " figure()\n", " plot(LX,LT_ite,color=\"blue\")\n", " plot(LX,LT_rec,color=\"red\")\n", " legend(('Itératif','Récursif'),loc='upper left', shadow=True)\n", " ylabel(\"Temps d'exécution\")\n", " xlabel('Entiers')\n", " show()\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Comparaison des factorielles" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Fact_Iteratif(n) :\n", " val_Temp=1\n", " for k in range(n) :\n", " val_Temp*=(k+1)\n", " return val_Temp\n", "\n", "def Fact_Recursif(n) :\n", " if n==0 :\n", " return 1\n", " else :\n", " return n*Fact_Recursif(n-1)\n" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 et 1\n", "1 et 1\n", "2 et 2\n", "6 et 6\n", "24 et 24\n", "120 et 120\n", "720 et 720\n", "5040 et 5040\n", "40320 et 40320\n", "362880 et 362880\n", "3628800 et 3628800\n", "39916800 et 39916800\n", "479001600 et 479001600\n" ] } ], "source": [ "\n", "for k in range(13) :\n", " print(Fact_Iteratif(k), \" et \",Fact_Recursif(k))\n" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Traces_Comp(Fact_Iteratif,Fact_Recursif,600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Conclusion** : algorithmes en complexité linéaire donc à peu près aussi efficaces. L'itératif semble un peu meilleur sur la fin : il évite l'appel récursif des fonctions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Comparaison de deux fonctions de cardinalité" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from random import *\n", "\n", "def Cardinal_Iteratif(L) :\n", " compteur=0\n", " L_Temp=L.copy()\n", " while L_Temp != [] :\n", " compteur+=1\n", " L_Temp=[x for x in L_Temp if x!=L_Temp[0]]\n", " return compteur\n", "\n", "def Cardinal_Recursif(L) :\n", " if L==[] :\n", " return 0\n", " else :\n", " return 1+Cardinal_Recursif([x for x in L if x!=L[0]])" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Voici les cardinaux calculés pour la liste L : 41 et 41 .\n", "Voici les cardinaux calculés pour la liste L : 42 et 42 .\n", "Voici les cardinaux calculés pour la liste L : 42 et 42 .\n", "Voici les cardinaux calculés pour la liste L : 36 et 36 .\n", "Voici les cardinaux calculés pour la liste L : 40 et 40 .\n", "Voici les cardinaux calculés pour la liste L : 43 et 43 .\n", "Voici les cardinaux calculés pour la liste L : 36 et 36 .\n", "Voici les cardinaux calculés pour la liste L : 38 et 38 .\n", "Voici les cardinaux calculés pour la liste L : 40 et 40 .\n", "Voici les cardinaux calculés pour la liste L : 34 et 34 .\n" ] } ], "source": [ "for k in range(10) :\n", " L=[randint(0,100) for i in range(50)]\n", " print(\"Voici les cardinaux calculés pour la liste L : \",Cardinal_Iteratif(L),\" et \",Cardinal_Recursif(L),\".\")" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def Traces_Comp_Cardinal(n):\n", " LX=list(range(n+1))\n", " LT_ite,LT_rec=[],[]\n", " for k in LX :\n", " L=[randint(0,3**n) for k in range(2**n)]\n", " \n", " t_0=time.clock()\n", " Cardinal_Iteratif(L)\n", " t_1=time.clock()\n", " LT_ite.append(log(t_1-t_0))\n", "\n", " t_2=time.clock()\n", " Cardinal_Recursif(L)\n", " t_3=time.clock()\n", " LT_rec.append(log(t_3-t_2))\n", " figure()\n", " plot(LX,LT_ite,color=\"blue\")\n", " plot(LX,LT_rec,color=\"red\")\n", " legend(('Itératif','Récursif'),loc='center', shadow=True)\n", " ylabel(\"Temps d'exécution\")\n", " xlabel('Entiers')\n", " show()\n", "\n", "Traces_Comp_Cardinal(9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Conclusion : les deux algorithmes ont la même complexité, mais l'itératif économise un peu sur les appels des fonctions intervenant lors de la récursivité." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Comparaison des suites de Fibonacci" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Fibo_Iteratif(n) :\n", " u,v=1,1\n", " for k in range(n-1) :\n", " u,v=v,u+v\n", " return v\n", " \n", "def Fibo_Recursif(n) :\n", " if n <= 1 :\n", " return 1\n", " else :\n", " return Fibo_Recursif(n-1)+Fibo_Recursif(n-2)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 et 1\n", "1 et 1\n", "2 et 2\n", "3 et 3\n", "5 et 5\n", "8 et 8\n", "13 et 13\n", "21 et 21\n", "34 et 34\n", "55 et 55\n" ] } ], "source": [ "for k in range(10) :\n", " print(Fibo_Iteratif(k),\" et \",Fibo_Recursif(k))" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Traces_Comp(Fibo_Iteratif,Fibo_Recursif,30) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Conclusion** : l'itératif est largement meilleur (complexité linéaire) alors que le récursif est de complexité exponontielle." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Comparaison des exponentiations" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x=np.exp(1)\n", "\n", "def Expo_Iteratif(n) :\n", " val_Temp=1\n", " for k in range(n) :\n", " val_Temp*=x\n", " return val_Temp\n", "\n", "def Expo_Recursif(n) :\n", " if n==0 :\n", " return 1\n", " else :\n", " if n%2==0 :\n", " val_Temp=Expo_Recursif(n//2)\n", " return val_Temp*val_Temp\n", " else :\n", " val_Temp=Expo_Recursif((n-1)//2)\n", " return (x*val_Temp*val_Temp)\n" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 et 1\n", "2.71828182846 et 2.71828182846\n", "7.38905609893 et 7.38905609893\n", "20.0855369232 et 20.0855369232\n", "54.5981500331 et 54.5981500331\n", "148.413159103 et 148.413159103\n", "403.428793493 et 403.428793493\n", "1096.63315843 et 1096.63315843\n", "2980.95798704 et 2980.95798704\n", "8103.08392758 et 8103.08392758\n" ] } ], "source": [ "\n", "for k in range(10) :\n", " print(Expo_Iteratif(k),\" et \", Expo_Recursif(k))\n" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXd4FOX2x78noYYmRUXpCiIIKBpUekexEEUpinhVBFG5\nYvmhKEq5ChZEBDtXRPCCqIgiKiIIKEVEEAQEkV6UXkNIQpI9vz/OTmZ2s5vdZMvMbs7neeaZ8k45\n75b3O+e8jZgZiqIoipIfCXYboCiKojgfFQtFURQlICoWiqIoSkBULBRFUZSAqFgoiqIoAVGxUBRF\nUQKiYqEoiqIERMVCURRFCYiKhaIoihKQYnYbEC6qVKnCtWvXttsMRVGUmGLNmjVHmPncQOfFjVjU\nrl0bq1evttsMRVGUmIKIdgdznoahFEVRlICoWCiKoigBUbFQFEVRAhI3dRa+yMrKwr59+5CRkWG3\nKTFBqVKlUL16dRQvXtxuUxRFcRhxLRb79u1DuXLlUKtWLei8HfnDzDh27Bj27t2Liy66yG5zFEVx\nGHEtFhkZGahVqxZSU1PVuwgCZsaRI0dQrlw5nHtuwJZ0iqIUIeJaLAAgPT0d6enpGlopAHPmzEG/\nfv1ARHaboiiKQ4j7Cu7s7GwkJDg7m7NmzcK+ffvsNgMAkJCQgLS0NJw9e9ZuU5QixKFDwOzZdluh\n5IezS9E4oFatWgCAPXv2YNasWXnS//e//+HIkSOoXr16ge89fvx4j/2uXbvmbo8YMQItW7bEiBEj\nCnxfRYk2118P3HYbkJpqtyWKP+I+DOUU9uzZg88//xy33367x/G77rrL7zXZ2dkoVsz/V/T666/j\nsccey92fN29e7va0adOwbds2JCYmhmC1okSHbdtk7XLZa4fiH/UsosTzzz+PlStXol27dnjnnXeQ\nk5ODESNGoFOnTmjTpg0+/PBDAMCyZctw0003oU+fPmjRogUAoG/fvujQoQNatmyJqVOnAgD+85//\nID09He3atcMDDzwAwPRi+vTpg7S0NHTs2BFffPFF9DOrKAVERcL5FBnPYtiwJGzYEN7sNm6cjdGj\nzwR17nPPPYe33noLH3/8MQBg6tSpKF++PBYuXIjMzEzccMMNaN++PQBg/fr1WLp0aW7hP3HiRFSs\nWBHp6eno3Lkzbr75ZgwfPhyTJ0/GkiVL8jxr+vTpqFWrls80RXEihlioaDiXIiMWTmPJkiX4448/\nMHfuXADAqVOnsGPHDhQvXhxNmzbNFQoAmDRpEr799lsAwN9//40dO3agUqVKttitKJFAxSIvRMCQ\nIcArr9htiVBkxCJYDyBaMDNeeukldOjQweP4smXLkJSU5LH/008/Yd68eUhKSkK3bt20z4gSdxgi\nkZNjrx1OY+xY54iF1llEibJly+L06dO5++3bt8eUKVOQlZUFANi2bRvS0tLyXHfq1ClUqFABSUlJ\n2Lp1K9asWZObVqxYsdzrFSWWUc/CEycOOFFkPAu7ueyyy5CYmIi2bduid+/eeOCBB7B371506NAB\nzIzKlSvjo48+ynNdx44dMXXqVDRv3hx169bFVVddlZt29913o02bNmjSpAnee++9aGZHUcKKehae\nOPFzoHgZMyk5OZm9Jz/avHkzLrzwQmRmZmoT0iDZuXMnli9fjoEDB6JkyZJ2m6MUEYzBAvbsAWrU\nsNcWJ5CZCZQqJduRLqKJaA0zJwc6T8NQiqI4Bg1DCU70LFQsFEVxDE4sJO3AiZ+DioWiKI5BPQvB\niWLhuApuIvoEQH337jkATjDzFTaapChKlHBiIWkHTvwcHOdZMHMvZr7CLRCfA9CxKBWliKCeheBL\nLMqWBR5/PPq2GDhOLAxIJlPoCeBju22JNN9//z3++OMPu81QFNtx4hu1Hfj6HNLSAK+BpqOKY8UC\nQGsAB5l5q92GhMJ5552Hdu3aoVWrVrjzzjtx8uRJj/QffvgBK1asQMOGDSNqx+DBg7FlyxYAMrlR\n8+bNkZKSEtFnKkpBUc9CcKJo2iIWRLSQiDb6WKyl1x0I4FUQ0QAiWk1Eqw8fPhxZowtJ6dKlsWTJ\nEixbtgwVK1bE5MmTPdI7duyIkSNHhmVWuuzsbL9pEyZMQP36UhU0ffp0jB8/HnPmzMn3fi4XMGGC\nvNEoSjRwYiFpB078HGwRC2buxMyNfCxzAICIigHoDuCTAPeZxMzJzJwcC3NGJycnY//+/bn7b7zx\nRu4Q5S+99FLu8U8++QRt2rRB27Zt8eCDDwIABg0ahK+++ir3HGOgQe8hzdPS0tC7d2+0bdsWrVq1\nyh2ivFu3bli7di3Gjh2LX375BYMHDw44MdKXXwKPPgo8/XTYPgJFyRf1LAQnioXjWkO56QTgT2YO\n21yjScOGodiGDeG6HQAgu3FjnBk9Oqhzc3JysHTpUvTp0wcAsHjxYuzYsQMLFiwAM6NPnz5YsWIF\nKlWqhHHjxmHevHmoXLkyjh8/HvDe1iHN586di6pVq2LmzJkAZGwpK0OGDMHSpUsxatQoNG3aNN/7\nGh7FsWNBZVFRQsaJhaQdeIumEwbacGqdRW/EScW2MUFRw4YNcejQIbRr1w6AiMWSJUvQvn17dOjQ\nAdu2bcOOHTuwdOlSpKSkoHLlygCAihUrBnyGdUjzBg0a4Mcff8SoUaPw888/o3z58oW2PQyRMUUp\nEOpZCN6imU+EOWo40rNg5nvCfc9gPYBwY9RZnDlzBj179sTkyZMxYMAAMDMGDx6Me+65x+P8//73\nvz7vk5iYCJf7n+RyuXD27NncNOuQ5nXr1sWiRYuwYMECjBkzBm3atMGQIUMKZbsT3maUooV6FoIT\nxcKpnkXckZSUhDFjxuDtt99GdnY2OnTogBkzZuQOW75//34cPnwYrVu3xpw5c3DMHfsxwlA1a9bE\n77//DgD47rvv/A5Nvn//fpQuXRo9e/bEoEGDsH79+ijkTlHCg3oWghPFwpGeRbzSpEkTNGzYELNn\nz0bPnj3x119/oWvXrgCAMmXK4J133sGll16Kxx9/HN26dUNiYiIaN26MN998E3379kXfvn3Rtm1b\ndOjQAWXKlPH5jM2bN2PkyJFISEhAsWLFMHbs2ELbq2EoJdqoWAhOFAsdolzxwDpE+WeflUTfvkCf\nPsD//me3ZUo8Y7yY/PAD4DV5ZMisXg3s3Qvcemt47xtJ1qwBkt2DhjMDhw4B559v7oeTYIcoV89C\nCUicvE8oMUAkPItmzWQdS79jJ3oWWmehKIpj0ApuQcXCBuIlzBYNmNnn56V1F0q00DoLQcUiypQq\nVQonT55UwQgCZkZqaioyMzN9pNlgkFIkUc9CcKJYxHWdRfXq1bF27Vows1ZwB4CZkZmZiX379oGZ\nkZCQoB6FEnXUsxC8xcJPS/moEtdiUbx4cVSsWBFz585F+fLlVTACwMw4deoUatSogeLFi9ttjlJE\nsHqu6lkI6lnYQL169dClSxesX7/eo9ezkpfExEQ0aNAgd0iSeCUjA9i40WyaqNiLtSBUz0JQsbCJ\nRo0aoVGjRnaboTiEhx8GPvgA2L0bqFnTbmsU6ztcJD0L5thprOFEsYjrCm4lPMRbBfeqVbL2modK\nsQmrWETSs4ilEJeKhRJTxMpbmBJ+/vwTOHgwvPd0uTyFwcDaAC+SYuGESuJg8f4cnGC7ioViK1Wr\nAjffbM+z481jCicNGgDuUe/DRs+eQMmSeY9HKwzlhAI3WNSzUGKSSBaqBw8CX38dufv7Qj2m4PDR\n5SYkPv888HPUsxBULBQlTOzfL4X+lCl2W6KESrQ8i3AXuGXKAK1bh/eeBioWSkzixDfxv/6SdShi\nUdTCUIcPA8uX221FXu8hVj2LM2eAZcvCe08DJ4pFkWg6q4SGEwvVcAiYE/MVSVq3BrZssT/fZ88C\npUp57htonYXgxB7c6lkofnGiRxEOjHzZXWhGmy1bZG13xzfvFlGx6lmEmxUrgOHDZduJnoWKhRLT\nhFLg211o+qN4caBTp8jd3+6BDLwrzmO1ziLctGwJPP+8/C5VLBQlTITi9RjXOrWTVna2zBgXKQK1\ncor05xKLnkVmJrB0qbkfSa/05Mn8xcKulxwVC6XI4lSxiDSBPItIh2ui4Vns3WuG3QxCydejjwJt\n2pgNKzIyCn+vQBw/nr9Y2OVlaAW34hfj7cnJsf3C2OZ0zyLSBPIsIi0W0fAsjDG/rL+PUPK1Zo2s\njx+X9ZkzZtrevUCNGoW/tze+xMJqe3Y2UKJE+J4XLOpZKH5xskiEg3CLxerVwdUH7N4NpKWF99kF\nwZeNixcDe/bIdqTfXL2fH62xoULJl/FfMArt9HQzrWbN8Dah9RYLZk9BtcuzULFQ/BLp2GgoYhSO\nFk3hFIvt24FmzYDHHgt8bu3aQNeu4Xt2QfHlWXToIEN8ANEPQ1n3wy3g4fIsjPucOgV89ZVn/QUA\nrFxZ+Ht7c+yY5+eQkwOsW2fuL1kC3HknMH48sHlz9F7qHCcWRHQFEa0konVEtJqIrrbbpqJKpMUi\nlPuH4w8SzoLp6FFZ//prcOd7FzbRxPom/8MPZssrI7QS7TCUt2exYQNwzz3heYO23iMcYnHyJJCS\nIoW1ldTUwt/bG2/PYvNm4Mcfzf2UFODjj4HHHwcaNgTuuy86zYIdJxYAXgEwipmvADDcva/YQKTf\nWEIpDAyhcVqdRSB7nNBc1/om37173pZX0fQs0tOBTZvM/ZwcoE8fYOpUz+OFxRruC5dY+OLIkeDu\nk5oK/POP7zTjd/n888DQoebxJk0kdDl5MvDmm+bxiy6SZcYMYP364J4fCk6s4GYA5d3bFQD4+WiV\nSBPpgi0UsQhHQR9OsQg2LGZnx7CEhLzDhPt6I46mZ9G7t4R1DFwus3f36dOhP8uokAbC46ns2uX7\n+Pbtga/NyABatZKC/YorZATe554DfvlFfjfGb+fvv81rmjYF1q4VUejVS8aj6t/fs4J7506gTp1C\nZylonCgWjwKYT0SvQjyfFjbbU2QJ5e09GFQs8hJJgTZstL7Z+7I3mp7FN994puXkAElJsh3s23p+\nWMUilHwZAufdHNfg99/N7X375PxDh4CJE4FzzhE7Vq40xcaog7jpJvO6Cy8EZs2S9fbtsv3WWzKm\nV/nypoh6t4SKhlAANokFES0EUNVH0jAAHQE8xsyfE1FPAJMB+OzPSkQDAAwAgJo6P2bYcXIYyijo\nnVLBHSyBCqxwt3Q5dQooW1a8ioQEybPd/SyszzdsAoDERBHL0qVl/9Chwt3f+r2GQyyYzTopo5+F\nNwcOyNwslStLQe+rEcGFF8qcHnfcIZXY550neW3QAKhSRXruG4Jeq5Y0OgDkPCdgi1gws9/BDIho\nGoDB7t3PALyfz30mAZgEAMnJyXHe0DP6xGsYKhJ1FkZeQvUswllQHzsmhdeIEcDIkb49i0jb4Avr\n8xMSPLdzckyxKOxMfdZ6imPHzG1r3wiDNWuARYuksnjZMqBSJWl80K+fvNH/9ZfMt3LggJzvqx6l\nQQOpeylTRgShYUPpd1GvHnDLLZJWu7ZnXmMRJ4ah/gHQFsASAB0AbLXVmiJMvIpFOO9hYBSwThKL\nw4dlPX26iIVRWAXyLKLZz8JbLKx1KkYBXVCsYmH1LH77TdY5OcDWrVK433yzzI0yfrysDR5+2POe\nxYpJ3crkyUDHjiJoV1wh4aHKlYEKFQpnayzhRLHoD2ACERUDkAF3mEmJPrEQhgoFO8QimgW1dw98\nb8/Cn62R8Cysz/InFuXLS7jHqHQPptLY4PBhYMgQ8Qzet8QiPvrI3P7sMynYv/oqb+shQyiqVAGa\nNwcqVhSPoX59qVwuX17qBuzsH2M3QYkFEV0LYASAWu5rCAAz8yXhNoiZlwG4Ktz3VQpOLHgWTmk6\n68QwlDF+kWGTt2fhrxe51QaXKzzhE+s9reMqWe/duLFUFBvfi1GZXL++zMVhiMDBg8D558s2s7QW\nGj0amD3b85kXXyyhpcRE4OWXgbFj5byGDcWTyMgQD6F/f2maWreu1BsovgnWs5gC4EkAawAU0RF1\nih6Rbg0VSmHttApuJ4ahjCEp/HkWp07lvcbl8rQhK0uaeBaWs2elULaKgrVpqPX4FVcAb79tCsHO\nnRL2+esvWfbvB779VtLatpXQ0N69npXOKSnSk75FCxn4b8UK8RIaNQIGDxZbypbNa6fRe13xT7Dv\nDKeYeS4z/8PMB40lopYptuPkMFQ4vJ5wicX8+cCrrwZ3rrcYvPuuFOJGRWw4w1BGha7xWXl7Fr46\nmKWn5xWLULjrLonnW/tMWAt3Q8BKlpS6gIwMecu//HJJu/9+81xDKADp1Xz6tISIRo2SsJLLBXz5\nJTBsGNC+vXgUrVuLUAAiLr6EQgmOYD2LRUT0IoDZAHLbMjBzFPoNKnYRC2GoUAiXWFx/vbldUM9i\n0iRZ79ol8fZwhoC8PQvjXvl5FqdOhVcsPvtM1i3cvaXOOUfqDIYOlXDSiRNy/JdfpFBv1Ur6V7zw\nghTsGzZIE9IKFWSgxs6dJVRkx6irRZ1gxaKV1xqQntZtwmuO4iSc7Fk4rc7CoKBiUcz9DzTe9r3H\nMgolBGR4FoZNiYmyNiqQfXkWBw7kHQ7buJfRWe7ee0V4Jk/2vDYjQ5rp/vmnrDdvNtN27pT18OHS\nTPXll2W/ZElprXX55bLvPWZWu3bmdvXq+WZXiTBBiQUzt460IYrzUM+i4BRULIwKVcMLsKafPRua\nWHh7FkZ+jbGJfHkW3mKRlSWeQEqK9Dr+/nvgww8l7f/+T5qf/vOPtCCyYh3CY8YMCT21bi3hoW7d\ngAsuENEuWTL2+x8UFYJtDVUOwHMwPYkfAbzAzGEca1FxGjrcR8HJ77M6ehSYN8/zmCEWxlt+OENA\n3p6FcT+jgtmXZ7F/v+eUtUuXAnPnyvZrrwHTpplpDRv6fm7ZsiIuTZqYHdOs97z44oLnRbGfYMNQ\nHwD4C8Dd7v2+kBZSt0fCKMUZRDoMFUph6LTWUAb52XPjjRKbt+ItFuEaUhvI61l4i4VRX2Bl505z\naAsAGDjQHJPIEIr//U8K/GnTRDCys4HkZGlRdM45ZrhLiS+CFYt6zNzDsv8cEa3ze7YSF0Q6DGWN\nRxcUpw33EQzrfPxj8vMsgpl1Lz+8W0MZ9963TwRkxQqgWjXPpqwvvCDr66+XiZzuvFOE4aWXgHLl\nZDiLa6+Vc4y1UjQIViwyiOhaZl4J5HbSi+CU5YoTcMLcC/6IRc/CGooxMCq4jfqDcIahDM/i9Glp\nAcUsYaGtW6XO4OBB4KGH5HP46itp/vvWW9I57qGHJIwUjpFflfggWLF4CMBHRFQS0nv7DMyQlBKn\nOHkO7liss/CFEXbyFYYqjGfhcsm9vvzSrB85fVoGsgNkBrqNG2X7mmukH0OZMsA774iYec8ApygG\nwbaG+g3AZURUyb1/LMAlShygnkXBKahnYYSKjE55Vm/i8GHg0ksDP3PJEhkk76efgDlzPNOSk0UU\nNm+WJq/9+pk9pAPZpihW8hULIrqDmT8moke8jgMAmHliBG1TbCbSraFCwUk9uK0UVCyMUNGePbK2\nehZGc1ODY8eAVauk7uDzzyV9+3bp12DQqBHQsqXMm5CVBVx9tQx3oSihEsizMH5m5/pIc2ARooQT\n71FLI/2sgrzdhmNcqUiIRX73zM+zMGZQs865sG4dMHOm1BssWgR88YWZlpAg4aNWrYAuXWRCnQoV\ndIwjJXLkKxbM/LZ78xujctvAXcmtxDHR9CxycszK3mDPBwpnWyTFoiD1DMymOGzbJkNsG2NMlS8P\nvPmmLICMjjpggAybUaqUrGvUCK/tipIfwf493wZwpdext6BDicc1RkEcqboLIllcrsKLRWEw8hMO\nsfDuWHj4sIR/rENd//yzhI28z33qKWDHDin8MzJEKFq1khBSx44yJHf79sBVV5k9nhXFLgLVWVwN\noDmAc73qLcoD0JHf4xyjUI2EWOTkiBiVLi1v1wV9hlHQF8a2cHoW3lOUnj0rdQiNG8t+ero5iJ43\nY8dKb+cvvxRPIikJuOwyM/2110K3T1HCRaB3uTIAqrjPs9ZbpALo4fMKJW6IpFgYrX5KlRKxKGjB\nHUqBH06xyPDR26hLF2DcOODHH4FffzWPjxgBPPmkDMG9YIGISP36UmGtKE4nUJ3FYgCLiWgKM++I\nkk2KQ4hkGMoQC2OgvMJ6FnaLhXWeBgB45BFg4kSgTx/Zr1ZNRlkdNkyGIAekEloropVYI9go8XtE\nlKcqkZm7hNkexUFEsoLb6lkAhfcsCjMYoZGvYK89flw+A6OwP3FC5lb47DNzPgoiEYgJE2T+hSNH\ngL59dd4FJX4IViyetWyXAnAbLJMgKfFJJMNQRquhUMUiFM/C2kw1P5o2ldDRtGkyPPevv5pzQrRu\nLRPyPPOMOYBeSkrBbVIUpxNsD26vsTLxIxF5H1PijGiEoQyxsCMMtXu3/3OOHpX0V181z7v7bqBW\nLeD226W+oVMncxgNRYl3gp3PorxlNwHSZFb7hcY5BfUsMjIk/BLMjGahhqEMm4we0AXBeJYxe9uu\nXVL3MGOGNN9dvhxYudL0PC6/HBg0SHpHX321TtajFE2CDUP9AemxTQCyAewE0D9SRinOoKBi0bOn\nTJTjcgXuE+BdwV3YMNThw1L3UJA+GkZ+9u0Devf27ANBJGGnXr2AZs0kxFS3bsFsU5R4JNgwlPYV\nLYIUdLgPY0a1zEzTY/BHuMJQzMChQzLPgjfjxkndSNeuMhx3WppMznP4MFCzpozH9OWXInKVKwPd\nu0sHOG3Kqih5CTYMNRDATGY+4d6vCKAHM0+KpHGKvRS2gvv06YKLRWE9C0DmgDbEwhhj6s8/ZY5o\nQCqfrSQlyZhLjRuLRxLIVkVRgg9DDWTmd40dZj5ORA8CCLtYENHlAN4FUBbALgB9mNnH1PJKpCms\nWKSlAVWq5H9OuFpDAVKfcPashI8WLZIZ+IzOcO++K88oVUrmk772WuC664BzfQ2NqSiKX4IVC49Z\ndYkoAZEb7uN9AP/HzD8S0X0AhgB4LkLPUvKhsK2hvDuq+aIwYagDB4BRo6SD26lTEi5KTTXntV67\nVtazZkll9EcfAXfdZV7fq1fweVAUxZNgxWIBEX0MeeMHgIEAFkbGJFwC4CfjuQDmQ8XCFgrqWSQm\nyht/QcSiIBXcd98tw2S86/4VDhggHsKnnwL33QfceqsMn6EoSvgJViyGQKZWfcy9vwDAexGxSFpe\npQD4EjL+lFau20RBK7gTEqTQT0sLfG4gz2LECJkP+vvvZWa3//xHhMKgZUvgiSeASy4BXnghOPsU\nRSk8wbaGyiGi9wDMY+ZtoT6UiBYCqOojaRiA+wBMJKLnAHwFwO8MAUQ0AMAAAKhZs2aoZileFNSz\nMPofFMSzMOZk+PNPGXH1yy+ln4Mxr8NVlkHwu3UDhg6V4TduuCE4mxRFCQ9+xYKIyjFzqnv7JgDj\nAJQAUIeIrgAwgplvLcxDmblTgFO6uJ97CYAb87nPJLgr2ZOTk3XmvjATSbE4eVLWbdvKmEujRwOz\nZ0vHOEB6Sj/5pFRYN20qzVvr1SuY/YqihI/8PIs7ieggM38JYBSAawAsBgBmXkdEEemqRETnMfMh\ndyX6szDrSZQoU9AKbmNspEBhKGZzVNbSpaU103/+I97FDTdIj+kBA2QojYceKpTpiqKEGb9iwczv\nEdFISN1BFjOfIM9uuZF6k7+DiB52b88GMCVCz1ECEE7PwuWS0VoPHABuu808XqoUMHw4cOWV0oLp\n4otDs1lRlMgQaD6Lke7NzUTUE0ACEdUB8AiAlX4vDAFmngBgQiTurRSMgg7lbYjF8eOyPnpUmrFO\nnmz2eyASb6JJE5n7wRAHHalVUZxNsK2hBgEYDsAFedufD6mMVuIYIwx14kRw5xuV1hs2SCe5Tp2A\ndevkWFIS0K8fUKECMHCgTAqkKErsEKxYZDPzUwCeMg4QUSUAQc4IoMQihmdx9Kg5jIY/mM1RWn/4\nQZq7GiLz1lvAgw8GHlxQURTnEuxgy6uIqJmxQ0QpAH6OjEmKUzDEIjPTf6V1VhYwZowM3c0sQ22U\nLCkD9U2fLvd46CEVCkWJdYL1LP4F4AMimg/gQgDVAHSOmFWKI7B2xjt6FChb1tzPygJee02auq5f\nLz2nhw6V4Th0KlFFiT+C7ZS3johGAPgYQCqAFsy8J6KWKbZjbQV19KiM7Pryy8B330mrpu3bRSQ+\n/RTo0cM+OxVFiTzBDlH+HoCGAK4AUB/APCIaz8yRGvJDcQBWz+K774DHHwd+/FH2O3cGnn8euOMO\ne2xTFCW6BBuG2goZppwBbCOiFQBeR+TGh1IcQHq6DDV+5IiM9FqlCjB2rHgRtWrZbZ2iKNEk2DDU\nq0RUgohqMvM2Zj4OqcdQ4oizZ6UX9qpVMuvdvHniQTz4ILBpE/DvfwPlywe+j6Io8UewYagbAbyG\nMI0NpTiTbt2A+fPN/SuuAKZMkT4Rt+o3rShFmmCbzv4HMjbUCUAqvAHoNPZxwowZMgSHIRS33ipT\nla5erZ3nFEURgq2ziObYUEqUWL1aBvH75RcZgqNHD/EkypSx2zJFUZxGsGIRtbGhHME//wDHjsnI\ndnHGmTPAs8/KFKRLlkgdxRNPyARCxkREiqIo3gQbhhoE4CqYY0NlAng0UkbZzsiRMoFCnJCRAXz7\nrcwN0b07MH68zGE9ZAiwZ49MNKRCoSgxxr59wMMPBz/SZ4gE2xoqDTIu1FOBzo0L0tKA1FS7rQgL\np04Bt99uTkmakABMnCgtmxRFiWEeeEDeArt1A667LuKPy1csiOi/kLqJk8w8JOLWOIWcHHMI1Rhl\n82ZxkD79VPYrVZLe1ykpwLnn2mqaoijhICdH1sFOOBMigTyLme51ZqQNcRQuV8yKxZkzQNeuwE8/\nyX5CAjBzJnDLLUDx4vbapihKGDEaHHF02hoFmvzoh6hY4TRizLOYO1d+N9Ony3ZamrRomj8fqFNH\nxnRSFCXOcJJYENFa5NNElpmvDLtFTiCGPIu9eyVkaWXmTKBXL3vsURQlSjhJLADc7l4PBJAI4CP3\nfh8AOZHGydLaAAAfPElEQVQyynZycqLWwiAUXC7glVdku0EDoH9/qbguFmyDaEVRYhcniQUzbwcA\nIuro5UWsJaLfEK+to1wuEYtA08PZxOrVwJw5wO+/S9ipf39g0iS7rVIUJao4SSwsJBLRtcy8EgCI\n6BqIpxGfGK0LsrMdVyv899/ANdeIiYmJwOuvA488YrdViqJEHYeKxf0AphCR0XUrHcB9kTHJARhN\n0rKyHCEWLpe0avr1V2lO7XLJ9KXvviuTDymKUgRxolgw868AGhFRZff+0YhaZTeGZ+GASu4DB6RF\nU7t2MvFQxYrAXXfJ/BLnn2+3dYqi2IYTxcIg7kXCwOpZ2EhaGlCvngzX8d13QLNmUkehIqEoSq5Y\n5ESnrVGwY0MVLax1Fjaxe7eIw+nTsv/FFzLwnwqFoigATLGI0kutbWJBRD2I6A8ichFRslfa00S0\njYi2EFHkBz3xxsYwFLMMy9GoEbBjB/D00zII7i23AElJUTdHURSnYoiFkwYSJKLuABYwcyoRDQVw\nJYAx7kmQCstGAN3hNY83ETUE0BvAZQAuBLCQiC5h5uj167ApDHXoEHDRRRJ+uvpq4L33ZLY6RVGU\nPDjUsxjpFooWAG4AMB3Au6E8mJk3M/MWH0kpAGYycyYz7wSwDcDVoTyrwNjgWZw8KR3q0tIk1LRs\nWRSE4vBh4F//kgGlFEWJLRwqFsZb/U0A3mPmOQBKRsYkVAOw17K/z30sekTRszhzRprEXn65jBD7\nwAMyYmxUWuw++ywwbZosiqLEFk4MQwHYT0RvAegK4CoiKoEghIaIFgKo6iNpmFtwQoKIBgAYAAA1\na9YM9XYmUargZga6dAGWLwfKlxexuO026VOhKIqSL1H2LIIVi56Q8NMbzHyciC4EMDTQRczcqRA2\n/Q2ghmW/uvuYr/tPAjAJAJKTk8PX2DgKYag1a4DPPxeheOQRCUHVrRuxxymKEm840bNg5tNE9CeA\nDkTUHsByZp4XIZu+AjCDiF6DVHDXA7AqQs/yTYTDUBkZQLK7/VeLFtL6yZZpTR047pWiKEHixDoL\nIhoG4GNI3UF1SGH+dCgPJqJbiWgfgOYAviGi+QDAzH8A+BTAJgDfAXg4qi2hgIh6Fjt2AO3by3ab\nNsBXXzlg/uso9QBVFCWMODQMdTeApsx8BgCIaDSAtQBeLOyDmfkLAF/4SRsNYHRh7x0yEfIsTp+W\naU03bgRGjwaeeSasty846lkoSuxivOQ5KQwFYL/XucXcx+KTCFRwMwP33gts2gR8/z3QuXPYbh06\n6lkoSuwR5f5gwYrFMQB/uENFDKALgF/d9Qpg5scjZJ89hDkMdewY8NBDwKxZMlmRY4RCPQtFiV2M\nl1mHeRbfuBeDlRGwxTmEUbFdLuCOO8Sb6N8f+L//C/mW4Uc9C8XpMAOpqdLGXBGc6Fkw8+RIG+Io\nwuRZnDwpney+/17mnnjggTDYFk7Us1BihSlTgH79gC1bgEsusdsaZ2B4FA5rDXU9Ef1KRIeI6BgR\nHSeiY5E2zjZCUezRo4HFiwEA48cDn3wiI2oMGBBG+8KNehaK0/n6a1lv2GCvHU7CKKeiFIYKtq/w\nmwAegDSdPRdAFfc6PgmlgvvZZ4EOHfD888CoUdKP4sMPHf4S7wSxWL5cPqStW+22RHEixvg3DpiQ\nzDE40bOAjM+0jpmzmDnHWCJpmK2EIRY4fLhMeTppUphsigRRbqedL8b4VAsX2muH4kwMsTh71l47\nnESUxSLYCu4nAcwloiUAMo2DzDwxEkbZTiHrLNatA4yBYm+7DZgxAyhRIrymRYTC/tiYgSFDgPvv\nBy69tHD3ePddoFo1c0AsJ3g5ivMw/kiZmfmfV5QwXmozMqLyuGA9i1GQkWfPgYSfjCU+KYRYZGYC\nE8ebztaHH8aAUITqWezaBYwbJzMzFZYHHwS6dTNtMT57RbFieBapqfba4SQMz+LEiag8LljPogYz\nN4qoJU6igGEoZqBsWSAxOwsfuI+VLRsZ08KK8RZfWLEwCvZwhAbUs1DyIzFR1idP2muHkzDKqePH\no/K4YD2L+UTUIaKWOIkCVnDv2CGnloDD4qlpabkts3wSbMxz/nzf56SnF942bwzPQsVC8YURflKx\nMDH+vw4Ti/sg05ue1qaznnz8MXDffbI9a7rDxGLAAKBDBwkX+cIqFj//DKzyMbjv0qXA9dcDI0fm\nTQt1hj2rMGgYKrb4+WdgZRT75hovJioWJlEOQwUrFlUAFAdQAUWp6WwAsUhNBe68E/jpJ6BSJaBt\n8wiKBbOMFbLfa0iuP/+Uybp9YbRJ9/fmYeQvK0va+F5zTd5zjh3zvJeVtLTAdueH1TMxwlBOaJml\nBKZFC6B58+g9z3gxOWbjO+qBA8DzzzvnhcZ4qT1xIio2BSUW7mayPQA85d6+AGbDn/gjSLGwlp97\n9wIlySIWb70lKhIMZ84AgwcDp075Tl+yBBg0CHjqKeCuu6Qvx7ZtknbVVcDAgb5/LIGaGwYThirm\nrtby1QolVLE4fdrcNjyLojAf+MaN0oosSp2p4gLjd3H4sH029OghbeLXr/edfuiQDALn73+clibp\nO3bI/tmzwGOPyTzKTz4pg8bddps0q/THiy+aoWXj9+NyRaXiP6gKbiJ6E+JZtAEwBsAZAO8CaBY5\n02wkyDDU2rWy3r0bSEqCZ6E8aJCsjVDL228D1atLyx9vJk0CJk6Um7zoY9R3YwIMAPjtN2DRIukp\nvnGj+SdKTwfKlPG8zijo/f2QrJ6FP4y3f1+CE2rBbhULQ4ycKBYffii/iX79fKdnZorYDxkCXHxx\n4PuNGAHMng00aiTd+wvC1KliixH7BIDPPgPeeAPo3h2oV09+F089Ffw916yRVmmNG8tv0ahM9odV\n5E6eBCpUKFgerDCLrSkpQMuW/s8zfoeHDpnHJk4EKlYE+vaV/Y8+ku/i/vvlbfv++4Grr5YOT1u2\nyHrDBnnZAoAFC+S/dMMNMl3luefKdJVvveW7F+2yZbK2CtY//8jzjx4Ffv9djjVuLPV8mZnyeZYv\nD9xzD/Ddd9LMddMmeQH873+B11+XxUrduiI4Y8YABw9K+rffykikhtB07Qr89Zd5zYkToX0PwcDM\nARcAv7nXay3Hfg/m2mgtV111FYeNxERmgHnwYPPY4sXMI0fm7v7wg5xSvz6zy+U+uGGDHLQuBt77\nVsaOlbTHHvOdbr1fqVLm9sUXm9sHD+a9rkULSZs1y/d9b7lF0u+5x799H3wgx5s3959Wp47v+wdi\n/XrzuXffLet//7tw94okho25X7QXn3wi6X36+E53ueS39PPPsn/99XL+nXea5zz/PPPXX/u+/o03\nmCdN8rRl0iTmCRPM78B7OX1azp8zh7l9e+ZLLmF+4gnznj/+yNypE/N33zFfeKF53a5dvm148UV5\nFjPz3r3m+WvWMJ84IXm3XpueLr+rrVtlPyODuV8/5nXrmHNymPv3Z778cuZKlcx7NWokfyxvRo82\nzylXTo6NGGEeq1+fuV07c3/aNM//ifdSv74s/tK/+YZ5wADmVavE5tWrmevVM9OfeUby+8QT/u8R\naLnmGuZzzsl7vHRp5sqVg79Ply7MLVsyb9/u+3sLAgCrOYgyNqiCGMAvkJCVIRqVrcLhhCWsYmF8\nEQ89lPcYy2+9YUPZXbDAct2aNXm/zEmTmB94wOP6PIwbx3nEyZc93kutWub2jh15r2vTRtImT/Z9\n35tukvS77jLvk5Xlec6ECWbazp2eaW+8wSGJxYoV5r1vvFHW/foV7l7h4O+/me+7jzktzTyWmWna\nuHmzHDt+nLlvX/mDpqebf/pBg6RQvPtuKQzWrJFCsUwZSa9aVb5j63fYsaOc6+/38dprZtrEiQUr\nkDp2ZK5YkblsWfNY3brMjRub++XLe16zerU8d8cO5s6d5SWhUSMz/ZlnmM8/3/8zN25kvvVWz2OX\nX8585ZXmfvHi/q+/5BLmZ59l/vZb5ueek2u9z7GKWzgX7++mIMsllzC//bb/9KpVmUeNEiEyjnXo\nwPzCC8wNGsjnM2SIfGdGulUQjeXSS2Xdp4+8bKSmhvyzD4tYACjmXt8NmdVuL6SD3mYAvYN5QLSW\nsImFy2V+Mf37Wz9RZoBzsl25ZezHH3td+/PPgX9UvjAKhEce8Z3u714XXWRub9iQ97oOHSRt/Hjf\n973uOkm3/rmPHPE854UXzLQnnxQbt22TtJdfluOFEYvdu80fPmAWmHfcIeknTjA/+CDzoUOB77Vw\nIfMrr3gec7nkze+JJ+RPOHiw6Rls2iT5yMw083Hvvcy9e4sN06czHzjA3L0782WXmTYmJDC/9JL5\nVnrBBcwVKnh+J/kVpL4W6/2N38errzKnpJieYaAlv7fkNm2Yf/opr50A89NPM7duzdyzp3jOAPPr\nrzPfdlvB8hDMYhVE76VYMSlsA92jZEnPz9n6EubrRc0qtMnJzP/9r7l/6aXystK3r7n922/+n12r\nlulBAiJYN9wgv68pU8zfnZFueH7vvSf/IYMzZ+Q37uv/yszctKln4bJypXhoq1bJb3TtWrHZ+kIT\nIuESi98s25cBGAzgUQCNgrl5NJewiUV2tvmF33OPedx97O7emQwwX3utnOrBjz8G/sH7wvhRDxrk\nO93fverWNbdXrsx7XZcukmYJn3lgfYsxFkMIDJ56yvMPZmzv3cs8fLi5788N3rqVeeBA8411yhTm\nZcsk3OQrT7fcIudNmiT7SUnibcycad5z8WLm998X2/r0Ma/NypI//P33i9B43/vrr+UPZ+zfeKNn\nCM5aoFrfvv0tvt56fS3e4YaUFCnAb79dCo9Vq8y0e+9lJsp7D6sX2bQp86+/SmH111/ymVh/eytW\nMN98M/Mvv5if2ZYtZnrFivLmbsWaXqKE73wMHcrcqpV8ny+9JB5xhQqyWF8qAPFYqlWTtAcfFKH+\n4gv5LCpUkHwuWMD8r3+ZIt65s//PsGNHMxzUrJmEXf/+W7xj44Xi/ffN83fulLfulBTJG7N4fbfd\nJqEwXxw9KtdWry4F8uzZYrv1tzd0qH9PnVnE9rXX/KcH4vvv5dl5CpfIES6xcFSoKb8lbGJhDTtY\nY9DuY+Vxgs87L2+0hpnliy6MWBh/tIED5QdvfWvYtMn/vUqXNrcXLZLzDx5k/uwz2W7bVtIef9zz\neQsXyhuKEaayLkahziyZLFFC4r/XXut5Xr16Eis19nv0kGtmzpQ/y+7dzJ9/br6lGn8+43wjtGHU\nDxlL/frypu/9xg3IfV95xf/n8dRT+Yc4vJdq1WSpXdt3mrE9ZIi5Xbeup8f56quyb6S3bSuF3/Tp\nzN26mX/6uXNFvDMyfP8GHnqIcwvZRo0k/AOIR3TttVLwX311XjE3OHlSPJEVK3ynZ2dLXcm8eb7T\njYISEE+0Vy9z/9//FmEIxCuvSKy/sBgVgc2aSXhv5Ur5jQYbajl4UDwYQxwKissl4mMVhyJAuMRi\nH4DH/S3BPCBaS9jEIj3d/JP06mX9RJkBPh/7/XqQ/PXXhROLoUMlrU4ds2D95x/Pt71Ay4wZ8lZt\nCMDu3WaatXL6+HGJoTdoYBZI1uWee5i//FI8BWsF3nPPydoIbXkvNWp41m9Y4+T+lueeE5uefNJ3\nevXqEuu1eg/WpXZtKdS9r69XT+y5+GLxhsaN8xSfMWPyfgdGpTMgdTje3HWXvMn749ln5bmF5fbb\n5dlGSGPZMhHq3bsLf8+CkJOT9zd61VX+vV0lbgiXWOwHMBzACF9LMA+I1hI2sTh92vzTdO9u/USZ\nAW5Qeifn5Pi51vrmHEgsjh83twcN8jynRAkpJIMVCsAzngswn3ee5/7334sAWd+SAc9C0t9Ss6bY\n6XJ51uls3iz7hsgFu+zf79myaP58OW59mwfkOHPeVmbTppm2GJ+lNXQybpxnutV2fwRKjzRGCCWE\nVi0hAzB37Wrf8xVbCHudhdOXsInFqVNmoXPzzczMvG8f5x7b+e0m/9fOnOlZqDVpkregzMkx3e2F\nC+U6axw9mCUpyQxb+AqhBFquucYUo9tvz9u6xKgwffllqfBOT/fMp5FuqGZKinntunUS0tiyRSqJ\nt20zBerbbz1F0srOnRIC3LVLwnBHj3qmHz8ux7yPGxw8KGknTrB/NXcwLpeEkuwkLc1PfFWJZ4IV\ni0Cd8pw8v1tksPaEdndWmzoVeMZ9qPb5+Qye591xrUGDvL09q1Qxh9/o1AmoWVM6FvmiWTOgRg3p\nwNWxo3QeeuIJIDkZ6NVLOvpVq+Z/7CdAhr+1dn4DpHPPqVPSiahVK+kotGULcNll0hmJWXqRduvm\nu4PWsmXAkSPmEB1TpkhHsLJlgcsvl2OVKsn6/PNlysAePSQ//qhdW9a1ask6Kckz/Zxz/F8LAOed\nl3+60yGSzlt24v2ZK4qFQGLRMSpW2EhWlgz3MmQIUK4czN7b7kSXC5g82RSLfEda9RaLzp1lEm4r\n3uM07dkjiy/mz5fpRmfPlt7Yjz4qYtarl/QGf+MNEZGGDeX8cePkXi4XULWqFMBNmkiv1bp1ge3b\nRZyqV5fzjesA6flrpU4d//msUkUWg4oVgdat/Z9funT+QqEoivMJxv2IxAIZa+oPAC4AyZbjlQEs\nBnAawJvB3q+wYaipUyVCktvF4fBhM6TSpg0vWsTuYJ37mEcvPC+M0JA1JHP//YHDQnXqSPPQVq2k\nBUj79maTyNRUaQ2zdq3vZ7pcEmfu1ElDCIqiFBiEKQwVSTYC6A7Ae8jUDADPAWjkXiKKMSxS7vBJ\nVs8iOxuTJ7uHXDFGRvY3hWFqqoSFrJQuLeO/1KkDDBsmxwYPBiZMMNdLlgBt23pet2iRuV22rAwH\n7Q8iGTdGURQlggQ7RHnYYebNzLzFx/E0Zl4GEY2IY4Tkc8dGs9RZHNiXhenTgT53WOoxrGGoTz+V\nmPy550rdAiBhJyOWX7q0rJ95RoY3NgYF279f1gcO5BUKRVEUB2KnZ+EIDLHIdSgsnsXR/VkoUwZ4\n+rEMGWMXAF54QUZ4zMgA3nkHKFkSuPlmSateXSpy27SRWZGMugFARMWgatW8xxRFURxMRMWCiBYC\nqOojaRgzzwnD/QcAGAAANWvWLNQ9jFG8czXC4llwVhbemQxUP2MZCnj9epmBzuDNN4GHH/a8adWq\nMk69oihKnBBRsWDmThG+/yQAkwAgOTmZC3OP/MJQJZCFlPangBpNfV+8bVtw8xcoiqLEOLbVWTiF\nYsWA9lgEV7ZbJCxhqOpJx1D+1eGyM3Qo8MEH5oVjxqhQKIpSZLBNLIjoViLaB6A5gG+IaL4lbReA\n1wDcQ0T7iKihn9uEzPnrv8cidES3LWPlgHuq0D3F6iDpzBFpsVSnjsxMd++95gx4Q4dGyiRFURTH\nYWdrqC+YuTozl2Tm85n5OktabWauxMxl3edsipQdxVKlk1zdE6sBAMs+lLmtZ/X4VOZL3b1bOrUZ\nLZwmTJDpEn1Nu6goihKnFPnWUJklZIiF0lkyyfqaj/9CKwA3PFYfqFku7wUJCUCJElG0UFEUxX6K\nfJ3F2eIyHk5S1kkcWLsfgw88jdPlquLSZj6EQlEUpYhS5MXClSUV2+XPHsHeMR8BAE4+qPURiqIo\nVop8GMqVJa2fqmVsR7VZT+HvhBq48MVHbLZKURTFWRR5z4Kzczz2R179LShBK68VRVGsqFhYxOKr\nkreDGkd87EJFUZSYQ8XCIhb7Ms/NnYNHURRFMSnyYmHUWQDAGSTlmQNIURRFUbHw8CwuqJCOlBQb\njVEURXEoKhYWsWhwbQXtb6coiuIDFQu3WCxvOggXT3nWZmsURVGcSZHvZ2GMMnvtjEeQeEGSzcYo\niqI4kyLvWbjcnkVC8USbLVEURXEuRV4s4BYLKqZioSiK4o8iLxa5FdyJKhaKoij+KPJikTsznoqF\noiiKX4q8WKhnoSiKEpgiLxbqWSiKogSmyIuFehaKoiiBKfJiAZeKhaIoSiBULNSzUBRFCYiKRU62\nrItpZ3ZFURR/FHmxIK3gVhRFCUiRF4vc1lAJ+lEoiqL4Q0tIVw5ykACQzrutKIriD9vEgoh6ENEf\nROQiomTL8c5EtIaINrjXHSJqSE4OXKQhKEVRlPyws1Z3I4DuAN7zOn4EwM3M/A8RNQIwH0C1SBlB\nOTnIQSKKR+oBiqIocYBtYsHMmwGAvMI/zLzWsvsHgNJEVJKZMyNhR1LJHHCCehaKoij54fQ6i9sA\n/BYpoQCArl1yULqMioWiKEp+RNSzIKKFAKr6SBrGzHMCXHsZgJcBdMnnnAEABgBAzZo1C2dkTo42\nm1UURQlARMWCmTsV5joiqg7gCwB3M/P2fO4/CcAkAEhOTuZCGalioSiKEhDHhaGI6BwA3wAYyszL\nI/5AFQtFUZSA2Nl09lYi2gegOYBviGi+O2kQgLoAhhPROvdyXsQMUbFQFEUJiJ2tob6AhJq8j78A\n4IWoGaJioSiKEhDHhaGijoqFoihKQFQsVCwURVEComKhYqEoihIQFQsVC0VRlICoWKhYKIqiBETF\nQsVCURQlICoWKhaKoigB0YmnW7YETp602wpFURRHo2Lx9NN2W6AoiuJ4NAylKIqiBETFQlEURQmI\nioWiKIoSEBULRVEUJSAqFoqiKEpAVCwURVGUgKhYKIqiKAFRsVAURVECQsxstw1hgYgOA9hdyMur\nADgSRnPsJF7yEi/5ADQvTiVe8hJqPmox87mBToobsQgFIlrNzMl22xEO4iUv8ZIPQPPiVOIlL9HK\nh4ahFEVRlICoWCiKoigBUbEQJtltQBiJl7zESz4AzYtTiZe8RCUfWmehKIqiBEQ9C0VRFCUgRVos\niOh6ItpCRNuIaKjd9gSCiD4gokNEtNFyrBIRLSCire51RUva0+68bSGi6+yx2jdEVIOIFhPRJiL6\ng4gGu4/HVH6IqBQRrSKi3935GOU+HlP5sEJEiUS0loi+du/HZF6IaBcRbSCidUS02n0sVvNyDhHN\nIqI/iWgzETWPel6YuUguABIBbAdwEYASAH4H0NBuuwLY3AbAlQA2Wo69AmCoe3sogJfd2w3deSoJ\noI47r4l258Fi9wUArnRvlwPwl9vmmMoPAAJQ1r1dHMAvAK6NtXx45elxADMAfB3jv7FdAKp4HYvV\nvEwFcL97uwSAc6Kdl6LsWVwNYBsz72DmswBmAkix2aZ8YeafABzzOpwC+SHBvb7FcnwmM2cy804A\n2yB5dgTMvJ+Zf3NvpwLYDKAaYiw/LJx27xZ3L4wYy4cBEVUHcCOA9y2HYzIvfoi5vBBRBciL4mQA\nYOazzHwCUc5LURaLagD2Wvb3uY/FGucz83739gEA57u3YyZ/RFQbQFPIW3nM5ccdtlkH4BCABcwc\nk/lw8zqAJwG4LMdiNS8MYCERrSGiAe5jsZiXOgAOA5jiDg++T0RlEOW8FGWxiDtYfNCYat5GRGUB\nfA7gUWY+ZU2Llfwwcw4zXwGgOoCriaiRV3pM5IOIbgJwiJnX+DsnVvLippX7e+kK4GEiamNNjKG8\nFIOEn99h5qYA0iBhp1yikZeiLBZ/A6hh2a/uPhZrHCSiCwDAvT7kPu74/BFRcYhQTGfm2e7DMZsf\nd2hgMYDrEZv5aAmgGxHtgoRlOxDR/xCbeQEz/+1eHwLwBSQUE4t52Qdgn9tjBYBZEPGIal6Kslj8\nCqAeEdUhohIAegP4ymabCsNXAP7l3v4XgDmW472JqCQR1QFQD8AqG+zzCRERJAa7mZlfsyTFVH6I\n6FwiOse9XRpAZwB/IsbyAQDM/DQzV2fm2pD/wyJmvgsxmBciKkNE5YxtAF0AbEQM5oWZDwDYS0T1\n3Yc6AtiEaOfF7lp+OxcAN0Ba4WwHMMxue4Kw92MA+wFkQd42+gGoDOAHAFsBLARQyXL+MHfetgDo\narf9XnlpBXGb1wNY515uiLX8AGgCYK07HxsBDHcfj6l8+MhXO5itoWIuL5BWjr+7lz+M/3cs5sVt\n2xUAVrt/Z18CqBjtvGgPbkVRFCUgRTkMpSiKogSJioWiKIoSEBULRVEUJSAqFoqiKEpAVCwURVGU\ngBSz2wBFcTpElANgg+XQTGZ+KZ/z2wE4y8wr3PsDAZxh5mkRNVRRIog2nVWUABDRaWYuW4DzRwI4\nzcyvFvJ5xZg5uzDXKkqkULFQlAD4Ewv3sBhTAdwMGW22B4AMACsB5EAGf/s3pMftaWZ+lYguBvAW\ngHMBnAHQn5n/JKIP3dc2BbAc0ht3gvtRDKANy+i8imILGoZSlMCUdo8qa/AiM3/i3j7CzFcS0UMA\n/o+Z7yeid2HxLIioo+XaSQAGMvNWIroGwNsAOrjTqgNowcw5RDQXwMPMvNw92GJGJDOoKIFQsVCU\nwKSzjF7qC2MAxDUAuud3E3eh3wLAZzI0FgCZoMbgM2bOcW8vB/AaEU0HMJuZ9xXKckUJEyoWihIa\nme51DgL/nxIAnMhHeNKMDWZ+iYi+gYyXtZyIrmPmP0O2VlEKiTadVZTwkwqZKtYDlvk6dhJRD0BG\n3iWiy33dgIguZuYNzPwyZITkSyNpsKIEQsVCUQJTmojWWRa/zWbdzAVwq/vc1l5pfQD0IyJjNFR/\nU/k+SkQbiWg9ZJTheSHlQFFCRFtDKYqiKAFRz0JRFEUJiIqFoiiKEhAVC0VRFCUgKhaKoihKQFQs\nFEVRlICoWCiKoigBUbFQFEVRAqJioSiKogTk/wGRTICxLNMQ2gAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Traces_Comp(Expo_Iteratif,Expo_Recursif,600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Conclusion** : le récursif est meilleur (complexité logarithmique) alors que l'itératif est linéaire ; la syntaxe $x**n$ est encore meilleure que le récursif\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Remarque** : les fonctions récursives seront utilisées dans les situations suivantes :\n", " \n", "$\\quad$ $\\longrightarrow$ interfaces graphiques où l'on rappelle une fonction de traçage par exemple\n", "\n", "$\\quad$ $\\longrightarrow$ fonctions de tris, en particulier, le tri par fusion ou le tri rapide" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Retour sur la suite de Fibonacci" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si l'on considère la suite de Fibonacci de termes $0,1,1,2,3,5,8,\\ldots$, en notant $F_n$ le $n^{\\grave{e}me}$ terme, on peut écrire pour tout entier naturel $n$, \n", "$\\displaystyle F_n=F_{1+[n/2]}^2-(-1)^n\\times F_{(n-1)/2}^2$.\n", "\n", "On peut donc comparer les deux fonctions suivantes :" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Fibo_Iteratif_bis(n) :\n", " u,v=0,1\n", " for k in range(n) :\n", " u,v=v,u+v\n", " return u\n", "\n", "def Fibo_Rec_bis(n) :\n", " if n<=1 :\n", " return n\n", " elif n==2 :\n", " return 1\n", " else :\n", " return (Fibo_Rec_bis(n//2+1))**2-(-1)**n*(Fibo_Rec_bis((n-1)//2))**2\n" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Indice 0 par itérations : 0 et par récursivité bis : 0\n", "Indice 1 par itérations : 1 et par récursivité bis : 1\n", "Indice 2 par itérations : 1 et par récursivité bis : 1\n", "Indice 3 par itérations : 2 et par récursivité bis : 2\n", "Indice 4 par itérations : 3 et par récursivité bis : 3\n", "Indice 5 par itérations : 5 et par récursivité bis : 5\n", "Indice 6 par itérations : 8 et par récursivité bis : 8\n", "Indice 7 par itérations : 13 et par récursivité bis : 13\n", "Indice 8 par itérations : 21 et par récursivité bis : 21\n", "Indice 9 par itérations : 34 et par récursivité bis : 34\n", "Indice 10 par itérations : 55 et par récursivité bis : 55\n", "Indice 11 par itérations : 89 et par récursivité bis : 89\n", "Indice 12 par itérations : 144 et par récursivité bis : 144\n", "Indice 13 par itérations : 233 et par récursivité bis : 233\n", "Indice 14 par itérations : 377 et par récursivité bis : 377\n", "Indice 15 par itérations : 610 et par récursivité bis : 610\n", "Indice 16 par itérations : 987 et par récursivité bis : 987\n", "Indice 17 par itérations : 1597 et par récursivité bis : 1597\n", "Indice 18 par itérations : 2584 et par récursivité bis : 2584\n", "Indice 19 par itérations : 4181 et par récursivité bis : 4181\n" ] } ], "source": [ "\n", "for n in range(20) :\n", " print(\"Indice \",n,\" par itérations : \",Fibo_Iteratif_bis(n),\" et par récursivité bis :\",Fibo_Rec_bis(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Examinons maintenant les temps de calculs :" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pylab import *\n", "import time\n", "\n", "def Traces_Comp_bis(F_Ite,F_Rec,n) :\n", " LX=list(range(2**(n+1)))\n", " LT_ite,LT_rec=[],[]\n", " for k in LX :\n", " t_0=time.clock()\n", " F_Ite(k)\n", " t_1=time.clock()\n", " LT_ite.append(log(t_1-t_0))\n", " for k in LX :\n", " t_0=time.clock()\n", " F_Rec(k)\n", " t_1=time.clock()\n", " LT_rec.append(log(t_1-t_0))\n", " figure()\n", " plot(LX,LT_ite,color=\"blue\")\n", " plot(LX,LT_rec,color=\"red\")\n", " legend(['Itératif','Récursif'],loc='upper left', shadow=True)\n", " ylabel(\"Temps d'exécution\")\n", " xlabel('Entiers')\n", " show()" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n=10\n", "\n", "Traces_Comp_bis(Fibo_Iteratif_bis,Fibo_Rec_bis,n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On va tenter d'améliorer la récursivité en mémorisant les valeurs calculées :" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def Fibo_Rec_ter(n) :\n", " L=(n+1)*[-1]\n", " def G_Temp(n) :\n", " if n<=1 :\n", " L[n]=n\n", " return n\n", " elif n==2 :\n", " L[2]=1\n", " return 1\n", " else :\n", " p,q=n//2+1,(n-1)//2\n", " if L[p] != -1 :\n", " a=L[p]\n", " else :\n", " a=G_Temp(p)\n", " L[p]=a\n", " if L[q] != -1 :\n", " b=L[q]\n", " else :\n", " b=G_Temp(q)\n", " L[q]=b\n", " c=a**2-(-1)**n*b**2\n", " L[n]=c\n", " return c\n", " \n", " return G_Temp(n)" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "n=12\n", "\n", "Traces_Comp_bis(Fibo_Iteratif_bis,Fibo_Rec_ter,n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette fois-ci, c'est la fonction récursive qui est bien meilleure." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 0 }