Préliminaires Itération Récursivité Itération vs Récursivité À faire pour lundi prochain Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Rappel Propriété fondamentale de N : Toute partie non vide de N a un plus petit élément pour ≤. On va dire que N est bien ordonné. Préliminaires Itération Récursivité À faire pour lundi prochain Définition On dit que (E , ≤E ) est bien ordonné, ou que ≤E est un bon ordre sur E lorsque toute partie non vide de E a un plus petit élément. Préliminaires Itération Récursivité Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : À faire pour lundi prochain Préliminaires Itération Récursivité Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) À faire pour lundi prochain Préliminaires Itération Récursivité Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) Un exemple d’ensemble mal ordonné : À faire pour lundi prochain Préliminaires Itération Récursivité Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) Un exemple d’ensemble mal ordonné : (R, ≤) À faire pour lundi prochain Préliminaires Itération Récursivité Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) Un exemple d’ensemble mal ordonné : (R, ≤) Un autre exemple d’ensemble bien ordonné : À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) Un exemple d’ensemble mal ordonné : (R, ≤) Un autre exemple d’ensemble bien ordonné : (N2 , ≤lex ) où ≤lex est Préliminaires Itération Récursivité À faire pour lundi prochain Exemples/Contre-exemple Un exemple trivial d’ensemble bien ordonné : (N, ≤) Un exemple d’ensemble mal ordonné : (R, ≤) Un autre exemple d’ensemble bien ordonné : (N2 , ≤lex ) où ≤lex est l’ordre lexicographique : (a, b) ≤lex (c, d) ⇔ a < c ou (a = c et b ≤ d). Préliminaires Itération Récursivité À faire pour lundi prochain Intérêt Théorème : Dans un ensemble bien ordonné, toute ”suite” strictement décroissante d’éléments est finie. Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité Test conditionnel C’est le ”si... alors... sinon...” À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. En langue naturelle : Si b*b-4*a*c<0 alors retourner("pas de racines") si par contre b*b-4*a*c=0 alors retourner("une unique racine") sinon retourner("deux racines") Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. En Python : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. En Python : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. En Caml : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. En Caml : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. Caml permet un truc très cool : le filtrage (pattern-matching) Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Comptons les racines réelles de aX 2 + bX + c. Caml permet un truc très cool : le filtrage (pattern-matching) Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité Boucle inconditionnelle C’est la boucle ”for”. À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En langue naturelle : Poser resultat=1 Pour i allant de 1 a n faire resultat = resultat*i Retourner(resultat) C’est la boucle inconditionnelle ascendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En langue naturelle, on peut aussi écrire : Poser resultat=1 Pour i allant de n a 1 (en descendant) faire resultat = resultat*i Retourner(resultat) C’est la boucle inconditionnelle descendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Python : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Python : Boucle inconditionnelle ascendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Python toujours : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Python toujours : Boucle inconditionnelle descendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Caml : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Caml : Boucle inconditionnelle ascendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Caml toujours : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons n!. En Caml toujours : Boucle inconditionnelle descendante. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant de boucle Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant de boucle Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant de boucle Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Pour une boucle for ascendante, on a un variant de boucle gratuit : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant de boucle Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Pour une boucle for ascendante, on a un variant de boucle gratuit : n − i. Pour une boucle for descendante, on a un variant de boucle gratuit : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant de boucle Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Pour une boucle for ascendante, on a un variant de boucle gratuit : n − i. Pour une boucle for descendante, on a un variant de boucle gratuit : i. Intérêt (futur !) : montrer la terminaison d’un algorithme (prochain cours). Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : invariant de boucle Définition : on appelle invariant de boucle une quantité qui reste inchangée après chaque tour de boucle. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : invariant de boucle Définition : on appelle invariant de boucle une quantité qui reste inchangée après chaque tour de boucle. Pour l’exemple de la factorielle calculée avec une boucle for ascendante : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : invariant de boucle Définition : on appelle invariant de boucle une quantité qui reste inchangée après chaque tour de boucle. Pour l’exemple de la factorielle calculée avec une boucle for ascendante : resultat ∗ i! est un invariant de boucle. Intérêt (futur !) : montrer la correction d’un algorithme (prochain cours). Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : sortie de boucle anticipée Il est possible de sortir d’une boucle inconditionnelle de façon prématurée, comme sur l’exemple ci-dessous : on parle alors de sortie de boucle anticipée. Ici c’est même une sortie anticipée de tout le programme. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : sortie de boucle anticipée Pour sortir uniquement de la boucle et pas de toute la fonction on utilise ”break” en Python. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : sortie de boucle anticipée Les sorties de boucle anticipées sont possibles en Caml mais plus difficiles à Coder : Pourquoi tant de haine ? Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : sortie de boucle anticipée Les sorties de boucle anticipées sont possibles en Caml mais plus difficiles à Coder : Pourquoi tant de haine ? C’est fait exprès. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : sortie de boucle anticipée Les sorties de boucle anticipées sont possibles en Caml mais plus difficiles à Coder : Pourquoi tant de haine ? C’est fait exprès. Les sorties de boucles anticipées compliquent les preuves de terminaison et de correction des algorithmes. Dans l’esprit de l’option, mieux vaut les éviter, si possible. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple où la boucle ”for” montre ses limites. Essayons de coder le calcul du pgcd avec une boucle for en Python. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple où la boucle ”for” montre ses limites. Essayons de coder le calcul du pgcd avec une boucle for en Python. Une sortie de boucle anticipée est nécessaire. Le code n’est pas très agréable. Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple où la boucle ”for” montre ses limites. En Caml c’est pire (juste pour le plaisir). Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité Boucle conditionnelle C’est la boucle ”while”. À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Le calcul du pgcd est plus adapté à une boucle conditionnelle. Calculons a ∧ b. En langue naturelle : Tant que b est non nul faire (a,b)=(b,a mod b) Retourner(a) (Tant que condition faire...) Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons a ∧ b. En Python : Préliminaires Itération Récursivité À faire pour lundi prochain Un exemple vaut mieux qu’un long discours Calculons a ∧ b. En Caml : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle On peut définir les variants de boucle et les invariants de boucle pour une boucle while comme pour une boucle for. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle On peut définir les variants de boucle et les invariants de boucle pour une boucle while comme pour une boucle for. Définition : on appelle variant de boucle Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle On peut définir les variants de boucle et les invariants de boucle pour une boucle while comme pour une boucle for. Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle On peut définir les variants de boucle et les invariants de boucle pour une boucle while comme pour une boucle for. Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Définition : on appelle invariant de boucle Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle On peut définir les variants de boucle et les invariants de boucle pour une boucle while comme pour une boucle for. Définition : on appelle variant de boucle un entier qui décroı̂t strictement à chaque tour de boucle ou, plus généralement, un élément d’un ensemble bien ordonné qui décroı̂t strictement à chaque tour de boucle. Définition : on appelle invariant de boucle une quantité qui reste inchangée après chaque tour de boucle. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle Exemple du calcul de a ∧ b par une boucle conditionnelle. Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle Exemple du calcul de a ∧ b par une boucle conditionnelle. Variant de boucle : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle Exemple du calcul de a ∧ b par une boucle conditionnelle. Variant de boucle : b Invariant de boucle : Préliminaires Itération Récursivité À faire pour lundi prochain Un peu de théorie : variant et invariant de boucle Exemple du calcul de a ∧ b par une boucle conditionnelle. Variant de boucle : b Invariant de boucle : a ∧ b Préliminaires Itération Récursivité À faire pour lundi prochain Exo ! Écrire une fonction qui calcule n! à l’aide d’une boucle conditionnelle (en langue naturelle ou en Python ou en Caml). Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité Définition générique de la récursivité : style de programmation dans lequel une fonction peut s’appeler elle-même. Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Reprenons l’exemple de la factorielle. À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Calculons n!. En langue naturelle : factorielle(n)= si n=0 alors 1 sinon n*factorielle(n-1) À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Calculons n!. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Calculons n!. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Calculons n!. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Calculons n!. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité enveloppée : exemple ! Remarque : 987!=? À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité enveloppée : exemple ! Remarque : 987!=? (Cf sys.setrecursionlimit) Python supporte le style récursif mais n’est pas optimisé pour ce style de programmation. Caml est optimisé pour le style récursif. Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité enveloppée : généralisation Plus généralemment, une fonction f : N → X est simplement récursive enveloppée lorsqu’elle est de la forme : f(n)= si n est un cas de base alors une valeur de base sinon g(n,f(n-1)) Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité enveloppée : généralisation Plus généralemment, une fonction f : N → X est récursive enveloppée lorsqu’elle est de la forme : f(n)= si n est un cas de base alors une valeur de base sinon g(n,f(m)) Avec m < n. (On peut se passer de cette condition mais alors on n’est plus sûr que le programme termine...) Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité enveloppée : généralisation Définition : une fonction f : E → X est récursive enveloppée lorsqu’elle est de la forme : f(x)= si x est un cas de base alors une valeur de base sinon g(x,f(y)) Avec y <E x où ≤E est un bon ordre sur E . (On peut se passer de cette condition mais alors on n’est plus sûr que le programme termine...) Préliminaires Itération Récursivité À faire pour lundi prochain Pourquoi ”enveloppée” ? Que se passe-t-il dans le ventre de la bête lors du calcul de 4! ? Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : exemple ! L’appel récursif est enveloppé par l’opération ”n*...” pour la factorielle, par la fonction ”g(...)” en général. Préliminaires Itération Récursivité À faire pour lundi prochain Pourquoi ”enveloppée” ? Pour qu’un langage supporte la récursivité enveloppée, il doit disposer d’une pile d’exécution. Les calculs se feront seulement au moment du dépilage. Préliminaires Itération Récursivité À faire pour lundi prochain Pourquoi ”enveloppée” ? Pour qu’un langage supporte la récursivité enveloppée, il doit disposer d’une pile d’exécution. Les calculs se feront seulement au moment du dépilage. À chaque appel récursif, on empile. Cela consomme de la mémoire. C’est dangereux. Préliminaires Itération Récursivité À faire pour lundi prochain Pourquoi ”enveloppée” ? Pour qu’un langage supporte la récursivité enveloppée, il doit disposer d’une pile d’exécution. Les calculs se feront seulement au moment du dépilage. À chaque appel récursif, on empile. Cela consomme de la mémoire. C’est dangereux. (C’est pour ça que le ”recursionlimit” est fixé à 987 en Python. Caml par contre est optimisé pour gérer convenablement cette pile.) Préliminaires Itération Récursivité Plan Préliminaires Bon ordre sur un type ou un ensemble Tests conditionnels Itération Boucles inconditionnelles Boucles conditionnelles Récursivité Récursivité enveloppée Récursivité terminale À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Est-on condamné à envelopper les appels récursifs ? Préliminaires Itération Récursivité À faire pour lundi prochain Est-on condamné à envelopper les appels récursifs ? 1. Non. Préliminaires Itération Récursivité À faire pour lundi prochain Est-on condamné à envelopper les appels récursifs ? 1. Non. 2. Même si dans un premier temps on ne s’en souciera pas trop. Préliminaires Itération Récursivité Récursivité terminale : exemple ! Reprenons l’exemple du pgcd. À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons a ∧ b. En langue naturelle : pgcd(a,b)= si b=0 alors a sinon pgcd(b,a mod b) À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons a ∧ b. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons a ∧ b. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons a ∧ b. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons a ∧ b. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : exemple ! On remarque que l’appel récursif est direct ! Il n’est pas enveloppé par une autre fonction. L’exécution de la fonction ne nécessite pas de pile. Les calculs ne nécessitent plus d’être différés. Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : généralisation Définition : une fonction f : E → X est récursive terminale lorsqu’elle est de la forme : f(x)= si x est un cas de base alors une valeur de base sinon f(y) Avec y <E x où ≤E est un bon ordre sur E . (On peut se passer de cette condition mais alors on n’est plus sûr que le programme termine...) Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : généralisation Définition : une fonction f : E → X est récursive terminale lorsqu’elle est de la forme : f(x)= si x est un cas de base alors une valeur de base sinon f(y) Avec y <E x où ≤E est un bon ordre sur E . (On peut se passer de cette condition mais alors on n’est plus sûr que le programme termine...) Sur l’exemple du pgcd on peut prendre E = N2 et ≤E =≤lex . Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : exemple pro ! Reprenons l’exemple de la factorielle. Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : exemple pro ! Calculons n! par récursivité terminale. En langue naturelle : factorielle(n)=f(n,1) où f(n,accu)= si n=0 alors accu sinon f(n-1,n*accu) Préliminaires Itération Récursivité À faire pour lundi prochain Récursivité terminale : exemple pro ! Calculons n! par récursivité terminale. En langue naturelle : factorielle(n)=f(n,1) où f(n,accu)= si n=0 alors accu sinon f(n-1,n*accu) (Ça marche ! Tester pour n=4...) Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons n! par récursivité terminale. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons n! par récursivité terminale. En Python : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons n! par récursivité terminale. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité Récursivité terminale : exemple ! Calculons n! par récursivité terminale. En Caml : À faire pour lundi prochain Préliminaires Itération Récursivité À faire pour lundi prochain DM01 ! À faire pour lundi prochain