[{"data":1,"prerenderedAt":10494},["ShallowReactive",2],{"navigation":3,"chapter-cours-nsi-tale\u002Ftd-langages-prog":585,"chapter-index-nsi-tale\u002Ftd-langages-prog":6947,"chapter-memo-nsi-tale\u002Ftd-langages-prog":7077},[4,224,440],{"title":5,"path":6,"stem":7,"children":8},"SNT — Seconde","\u002Fsnt-2nde","0.snt-2nde\u002F0.index",[9,10,14,36,66,92,118,144,162,184,206],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"REVIEW pédagogique — SNT 2nde","\u002Fsnt-2nde\u002Freview","0.snt-2nde\u002FREVIEW",{"title":15,"path":16,"stem":17,"children":18},"Internet","\u002Fsnt-2nde\u002Fsa-internet","0.snt-2nde\u002Fsa-internet\u002F0.index",[19,20,24,28,32],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23},"Adresses symboliques et DNS","\u002Fsnt-2nde\u002Fsa-internet\u002Fadresses-dns","0.snt-2nde\u002Fsa-internet\u002F1.adresses-dns",{"title":25,"path":26,"stem":27},"Internet et les réseaux physiques","\u002Fsnt-2nde\u002Fsa-internet\u002Freseaux-physiques","0.snt-2nde\u002Fsa-internet\u002F2.reseaux-physiques",{"title":29,"path":30,"stem":31},"Protocoles TCP\u002FIP et routage des paquets","\u002Fsnt-2nde\u002Fsa-internet\u002Ftcp-ip-routage","0.snt-2nde\u002Fsa-internet\u002F3.tcp-ip-routage",{"title":33,"path":34,"stem":35},"Réseaux pair-à-pair","\u002Fsnt-2nde\u002Fsa-internet\u002Fpair-a-pair","0.snt-2nde\u002Fsa-internet\u002F4.pair-a-pair",{"title":37,"path":38,"stem":39,"children":40},"Le Web","\u002Fsnt-2nde\u002Fsb-web","0.snt-2nde\u002Fsb-web\u002F0.index",[41,42,46,50,54,58,62],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Histoire du Web","\u002Fsnt-2nde\u002Fsb-web\u002Fhistoire-web","0.snt-2nde\u002Fsb-web\u002F1.histoire-web",{"title":47,"path":48,"stem":49},"URL et hypertexte","\u002Fsnt-2nde\u002Fsb-web\u002Furl-hypertexte","0.snt-2nde\u002Fsb-web\u002F2.url-hypertexte",{"title":51,"path":52,"stem":53},"HTML et CSS — le contenu et la présentation","\u002Fsnt-2nde\u002Fsb-web\u002Fhtml-css","0.snt-2nde\u002Fsb-web\u002F3.html-css",{"title":55,"path":56,"stem":57},"Client-serveur et requêtes HTTP","\u002Fsnt-2nde\u002Fsb-web\u002Fclient-serveur-http","0.snt-2nde\u002Fsb-web\u002F4.client-serveur-http",{"title":59,"path":60,"stem":61},"Moteurs de recherche","\u002Fsnt-2nde\u002Fsb-web\u002Fmoteurs-recherche","0.snt-2nde\u002Fsb-web\u002F5.moteurs-recherche",{"title":63,"path":64,"stem":65},"Sécurité du navigateur et notions juridiques","\u002Fsnt-2nde\u002Fsb-web\u002Fsecurite-droits","0.snt-2nde\u002Fsb-web\u002F6.securite-droits",{"title":67,"path":68,"stem":69,"children":70},"Les réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F0.index",[71,72,76,80,84,88],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Panorama des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpanorama-rs","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F1.panorama-rs",{"title":77,"path":78,"stem":79},"Identité numérique et authentification","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fidentite-numerique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F2.identite-numerique",{"title":81,"path":82,"stem":83},"Le modèle économique des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fmodele-economique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F3.modele-economique",{"title":85,"path":86,"stem":87},"Petit monde et graphes","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpetit-monde-graphes","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F4.petit-monde-graphes",{"title":89,"path":90,"stem":91},"La cyberviolence","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fcyberviolence","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F5.cyberviolence",{"title":93,"path":94,"stem":95,"children":96},"Les données structurées et leur traitement","\u002Fsnt-2nde\u002Fsd-donnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F0.index",[97,98,102,106,110,114],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101},"Données et formats","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-formats","0.snt-2nde\u002Fsd-donnees-structurees\u002F1.donnees-formats",{"title":103,"path":104,"stem":105},"Données structurées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F2.donnees-structurees",{"title":107,"path":108,"stem":109},"Métadonnées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fmetadonnees","0.snt-2nde\u002Fsd-donnees-structurees\u002F3.metadonnees",{"title":111,"path":112,"stem":113},"Traitement de tables","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Ftraitement-tables","0.snt-2nde\u002Fsd-donnees-structurees\u002F4.traitement-tables",{"title":115,"path":116,"stem":117},"Le cloud","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fcloud","0.snt-2nde\u002Fsd-donnees-structurees\u002F5.cloud",{"title":119,"path":120,"stem":121,"children":122},"Localisation, cartographie et mobilité","\u002Fsnt-2nde\u002Fse-localisation-cartographie","0.snt-2nde\u002Fse-localisation-cartographie\u002F0.index",[123,124,128,132,136,140],{"title":119,"path":120,"stem":121},{"title":125,"path":126,"stem":127},"GPS et Galileo — se situer grâce aux satellites","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fgps-galileo","0.snt-2nde\u002Fse-localisation-cartographie\u002F1.gps-galileo",{"title":129,"path":130,"stem":131},"Décoder une trame NMEA","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Ftrame-nmea","0.snt-2nde\u002Fse-localisation-cartographie\u002F2.trame-nmea",{"title":133,"path":134,"stem":135},"Cartes numériques — GeoPortail et OpenStreetMap","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fcartes-numeriques","0.snt-2nde\u002Fse-localisation-cartographie\u002F3.cartes-numeriques",{"title":137,"path":138,"stem":139},"Itinéraires et graphes","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fitineraires-graphes","0.snt-2nde\u002Fse-localisation-cartographie\u002F4.itineraires-graphes",{"title":141,"path":142,"stem":143},"Confidentialité de la position","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fconfidentialite-position","0.snt-2nde\u002Fse-localisation-cartographie\u002F5.confidentialite-position",{"title":145,"path":146,"stem":147,"children":148},"Informatique embarquée et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee","0.snt-2nde\u002Fsf-info-embarquee\u002F0.index",[149,150,154,158],{"title":145,"path":146,"stem":147},{"title":151,"path":152,"stem":153},"Systèmes informatiques embarqués","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fsystemes-embarques","0.snt-2nde\u002Fsf-info-embarquee\u002F1.systemes-embarques",{"title":155,"path":156,"stem":157},"Capteurs et actionneurs","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fcapteurs-actionneurs","0.snt-2nde\u002Fsf-info-embarquee\u002F2.capteurs-actionneurs",{"title":159,"path":160,"stem":161},"IHM et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fihm-objet-connecte","0.snt-2nde\u002Fsf-info-embarquee\u002F3.ihm-objet-connecte",{"title":163,"path":164,"stem":165,"children":166},"Photographie numérique","\u002Fsnt-2nde\u002Fsg-photo-numerique","0.snt-2nde\u002Fsg-photo-numerique\u002F0.index",[167,168,172,176,180],{"title":163,"path":164,"stem":165},{"title":169,"path":170,"stem":171},"Photosites, pixels et résolution","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fpixels-resolution","0.snt-2nde\u002Fsg-photo-numerique\u002F1.pixels-resolution",{"title":173,"path":174,"stem":175},"Les algorithmes de l'appareil photo","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Falgorithmes-photo","0.snt-2nde\u002Fsg-photo-numerique\u002F2.algorithmes-photo",{"title":177,"path":178,"stem":179},"Les métadonnées EXIF","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fmetadonnees-exif","0.snt-2nde\u002Fsg-photo-numerique\u002F3.metadonnees-exif",{"title":181,"path":182,"stem":183},"Traiter une image en Python","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Ftraitement-rgb","0.snt-2nde\u002Fsg-photo-numerique\u002F4.traitement-rgb",{"title":185,"path":186,"stem":187,"children":188},"Notions transversales de programmation","\u002Fsnt-2nde\u002Fsh-prog-notions","0.snt-2nde\u002Fsh-prog-notions\u002F0.index",[189,190,194,198,202],{"title":185,"path":186,"stem":187},{"title":191,"path":192,"stem":193},"Séquences d'instructions et variables","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fsequences-affectations","0.snt-2nde\u002Fsh-prog-notions\u002F1.sequences-affectations",{"title":195,"path":196,"stem":197},"Instructions conditionnelles","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fconditionnelles","0.snt-2nde\u002Fsh-prog-notions\u002F2.conditionnelles",{"title":199,"path":200,"stem":201},"Boucles bornées et non bornées","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fboucles","0.snt-2nde\u002Fsh-prog-notions\u002F3.boucles",{"title":203,"path":204,"stem":205},"Définitions et appels de fonctions","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Ffonctions","0.snt-2nde\u002Fsh-prog-notions\u002F4.fonctions",{"title":207,"path":208,"stem":209,"children":210},"Démo des widgets MDC","\u002Fsnt-2nde\u002Fzz-demo-widgets","0.snt-2nde\u002Fzz-demo-widgets\u002F0.index",[211,212,216,220],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215},"Démo statique — callouts, code, BO, illustration","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fstatique","0.snt-2nde\u002Fzz-demo-widgets\u002F1.statique",{"title":217,"path":218,"stem":219},"Démo interactive — self-eval et python-snippet","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Finteractif","0.snt-2nde\u002Fzz-demo-widgets\u002F2.interactif",{"title":221,"path":222,"stem":223},"Démo · 14 widgets de manipulation NSI","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fwidgets-manipulation","0.snt-2nde\u002Fzz-demo-widgets\u002F3.widgets-manipulation",{"title":225,"path":226,"stem":227,"children":228},"NSI — Première","\u002Fnsi-1ere","1.nsi-1ere\u002F0.index",[229,230,234,256,282,304,328,354,380,410],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233},"Relecture pédagogique — 8 chapitres NSI 1ère (PA → PH)","\u002Fnsi-1ere\u002Freview","1.nsi-1ere\u002FREVIEW",{"title":235,"path":236,"stem":237,"children":238},"Histoire de l'informatique","\u002Fnsi-1ere\u002Fpa-histoire-info","1.nsi-1ere\u002Fpa-histoire-info\u002F0.index",[239,240,244,248,252],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"De la préantiquité aux machines à calculer","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fpreantiquite-aux-machines","1.nsi-1ere\u002Fpa-histoire-info\u002F1.preantiquite-aux-machines",{"title":245,"path":246,"stem":247},"La machine universelle (1930-1950)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fmachine-universelle","1.nsi-1ere\u002Fpa-histoire-info\u002F2.machine-universelle",{"title":249,"path":250,"stem":251},"Les ordinateurs modernes (1947-1990)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fordinateurs-modernes","1.nsi-1ere\u002Fpa-histoire-info\u002F3.ordinateurs-modernes",{"title":253,"path":254,"stem":255},"Réseaux, Web et IA (1969 à aujourd'hui)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Freseaux-et-web","1.nsi-1ere\u002Fpa-histoire-info\u002F4.reseaux-et-web",{"title":257,"path":258,"stem":259,"children":260},"Représentation des données — types et valeurs","\u002Fnsi-1ere\u002Fpb-types-valeurs","1.nsi-1ere\u002Fpb-types-valeurs\u002F0.index",[261,262,266,270,274,278],{"title":257,"path":258,"stem":259},{"title":263,"path":264,"stem":265},"Bases de numération et entiers positifs","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbases-entiers-positifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F1.bases-entiers-positifs",{"title":267,"path":268,"stem":269},"Entiers relatifs et complément à deux","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fentiers-relatifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F2.entiers-relatifs",{"title":271,"path":272,"stem":273},"Nombres flottants et virgule flottante","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fflottants","1.nsi-1ere\u002Fpb-types-valeurs\u002F3.flottants",{"title":275,"path":276,"stem":277},"Textes et encodages — ASCII, ISO-8859-1, Unicode","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Ftextes-encodages","1.nsi-1ere\u002Fpb-types-valeurs\u002F4.textes-encodages",{"title":279,"path":280,"stem":281},"Valeurs booléennes et opérateurs logiques","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbooleens","1.nsi-1ere\u002Fpb-types-valeurs\u002F5.booleens",{"title":283,"path":284,"stem":285,"children":286},"Représentation des données : types construits","\u002Fnsi-1ere\u002Fpc-types-construits","1.nsi-1ere\u002Fpc-types-construits\u002F0.index",[287,288,292,296,300],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"Tableaux et listes","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftableaux-listes","1.nsi-1ere\u002Fpc-types-construits\u002F1.tableaux-listes",{"title":293,"path":294,"stem":295},"Listes en compréhension","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fcomprehension","1.nsi-1ere\u002Fpc-types-construits\u002F2.comprehension",{"title":297,"path":298,"stem":299},"Tuples et p-uplets nommés","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftuples","1.nsi-1ere\u002Fpc-types-construits\u002F3.tuples",{"title":301,"path":302,"stem":303},"Dictionnaires","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fdictionnaires","1.nsi-1ere\u002Fpc-types-construits\u002F4.dictionnaires",{"title":305,"path":306,"stem":307,"children":308},"Traitement de données en tables","\u002Fnsi-1ere\u002Fpd-tables-donnees","1.nsi-1ere\u002Fpd-tables-donnees\u002F0.index",[309,310,314,318,322],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313},"Tables et CSV","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftables-csv","1.nsi-1ere\u002Fpd-tables-donnees\u002F1.tables-csv",{"title":315,"path":316,"stem":317},"Recherche et filtrage","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Frecherche","1.nsi-1ere\u002Fpd-tables-donnees\u002F2.recherche",{"title":319,"path":320,"stem":321},"Trier une table","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftri","1.nsi-1ere\u002Fpd-tables-donnees\u002F3.tri",{"title":323,"path":324,"stem":325,"children":326},"Fusion et indexation","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ffusion-indexation","1.nsi-1ere\u002Fpd-tables-donnees\u002F4.fusion-indexation",[327],{"title":323,"path":324,"stem":325},{"title":329,"path":330,"stem":331,"children":332},"IHM sur le Web","\u002Fnsi-1ere\u002Fpe-ihm-web","1.nsi-1ere\u002Fpe-ihm-web\u002F0.index",[333,334,338,342,346,350],{"title":329,"path":330,"stem":331},{"title":335,"path":336,"stem":337},"HTML et CSS — rappel de structure","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fhtml-css-bases","1.nsi-1ere\u002Fpe-ihm-web\u002F1.html-css-bases",{"title":339,"path":340,"stem":341},"Formulaires HTML","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fformulaires","1.nsi-1ere\u002Fpe-ihm-web\u002F2.formulaires",{"title":343,"path":344,"stem":345},"Événements JavaScript","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fevenements-js","1.nsi-1ere\u002Fpe-ihm-web\u002F3.evenements-js",{"title":347,"path":348,"stem":349},"Manipulation du DOM","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fdom-interaction","1.nsi-1ere\u002Fpe-ihm-web\u002F4.dom-interaction",{"title":351,"path":352,"stem":353},"Client, serveur et HTTP","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fclient-serveur-http","1.nsi-1ere\u002Fpe-ihm-web\u002F5.client-serveur-http",{"title":355,"path":356,"stem":357,"children":358},"Architectures matérielles et systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os","1.nsi-1ere\u002Fpf-archi-os\u002F0.index",[359,360,364,368,372,376],{"title":355,"path":356,"stem":357},{"title":361,"path":362,"stem":363},"Le modèle de von Neumann","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fvon-neumann","1.nsi-1ere\u002Fpf-archi-os\u002F1.von-neumann",{"title":365,"path":366,"stem":367},"Périphériques et interface homme-machine","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fperipheriques-ihm","1.nsi-1ere\u002Fpf-archi-os\u002F2.peripheriques-ihm",{"title":369,"path":370,"stem":371},"Les systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fsystemes-exploitation","1.nsi-1ere\u002Fpf-archi-os\u002F3.systemes-exploitation",{"title":373,"path":374,"stem":375},"Linux et le shell","\u002Fnsi-1ere\u002Fpf-archi-os\u002Flinux-shell","1.nsi-1ere\u002Fpf-archi-os\u002F4.linux-shell",{"title":377,"path":378,"stem":379},"Réseaux et protocoles","\u002Fnsi-1ere\u002Fpf-archi-os\u002Freseaux","1.nsi-1ere\u002Fpf-archi-os\u002F5.reseaux",{"title":381,"path":382,"stem":383,"children":384},"Langages et programmation","\u002Fnsi-1ere\u002Fpg-langages-prog","1.nsi-1ere\u002Fpg-langages-prog\u002F0.index",[385,386,390,394,398,402,406],{"title":381,"path":382,"stem":383},{"title":387,"path":388,"stem":389},"Diversité et unité des langages de programmation","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fdiversite-langages","1.nsi-1ere\u002Fpg-langages-prog\u002F1.diversite-langages",{"title":391,"path":392,"stem":393},"Constructions élémentaires","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fconstructions-elementaires","1.nsi-1ere\u002Fpg-langages-prog\u002F2.constructions-elementaires",{"title":395,"path":396,"stem":397},"Fonctions","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Ffonctions","1.nsi-1ere\u002Fpg-langages-prog\u002F3.fonctions",{"title":399,"path":400,"stem":401},"Spécification d'une fonction","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fspecification","1.nsi-1ere\u002Fpg-langages-prog\u002F4.specification",{"title":403,"path":404,"stem":405},"Mise au point des programmes","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fmise-au-point","1.nsi-1ere\u002Fpg-langages-prog\u002F5.mise-au-point",{"title":407,"path":408,"stem":409},"Utilisation de bibliothèques","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fbibliotheques","1.nsi-1ere\u002Fpg-langages-prog\u002F6.bibliotheques",{"title":411,"path":412,"stem":413,"children":414},"Algorithmique","\u002Fnsi-1ere\u002Fph-algorithmique","1.nsi-1ere\u002Fph-algorithmique\u002F0.index",[415,416,420,424,428,432,436],{"title":411,"path":412,"stem":413},{"title":417,"path":418,"stem":419},"Parcours séquentiel d'un tableau","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fparcours-sequentiel","1.nsi-1ere\u002Fph-algorithmique\u002F1.parcours-sequentiel",{"title":421,"path":422,"stem":423},"Bases de la complexité","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fcomplexite-bases","1.nsi-1ere\u002Fph-algorithmique\u002F2.complexite-bases",{"title":425,"path":426,"stem":427},"Tris par sélection et par insertion","\u002Fnsi-1ere\u002Fph-algorithmique\u002Ftris","1.nsi-1ere\u002Fph-algorithmique\u002F3.tris",{"title":429,"path":430,"stem":431},"Recherche dichotomique","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fdichotomie","1.nsi-1ere\u002Fph-algorithmique\u002F4.dichotomie",{"title":433,"path":434,"stem":435},"Algorithmes gloutons","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fgloutons","1.nsi-1ere\u002Fph-algorithmique\u002F5.gloutons",{"title":437,"path":438,"stem":439},"Les k plus proches voisins (k-NN)","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fknn","1.nsi-1ere\u002Fph-algorithmique\u002F6.knn",{"title":441,"path":442,"stem":443,"children":444},"NSI — Terminale","\u002Fnsi-tale","2.nsi-tale\u002F0.index",[445,446,450,476,498,536,560],{"title":441,"path":442,"stem":443},{"title":447,"path":448,"stem":449},"Review pédagogique — chapitres NSI Terminale (TA, TB, TC, TD, TE)","\u002Fnsi-tale\u002Freview","2.nsi-tale\u002FREVIEW",{"title":451,"path":452,"stem":453,"children":454},"Structures de données","\u002Fnsi-tale\u002Fta-structures-donnees","2.nsi-tale\u002Fta-structures-donnees\u002F0.index",[455,456,460,464,468,472],{"title":451,"path":452,"stem":453},{"title":457,"path":458,"stem":459},"Objet, classe, interface","\u002Fnsi-tale\u002Fta-structures-donnees\u002Finterface-implementation","2.nsi-tale\u002Fta-structures-donnees\u002F1.interface-implementation",{"title":461,"path":462,"stem":463},"Implémenter une structure — l'exemple de la file FIFO","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fimplementer-une-structure","2.nsi-tale\u002Fta-structures-donnees\u002F2.implementer-une-structure",{"title":465,"path":466,"stem":467},"Listes, piles, files, dictionnaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Flistes-piles-files-dict","2.nsi-tale\u002Fta-structures-donnees\u002F3.listes-piles-files-dict",{"title":469,"path":470,"stem":471},"Arbres binaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Farbres-binaires","2.nsi-tale\u002Fta-structures-donnees\u002F4.arbres-binaires",{"title":473,"path":474,"stem":475},"Graphes","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fgraphes","2.nsi-tale\u002Fta-structures-donnees\u002F5.graphes",{"title":477,"path":478,"stem":479,"children":480},"Bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees","2.nsi-tale\u002Ftb-bases-de-donnees\u002F0.index",[481,482,486,490,494],{"title":477,"path":478,"stem":479},{"title":483,"path":484,"stem":485},"Le modèle relationnel","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fmodele-relationnel","2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel",{"title":487,"path":488,"stem":489},"Bases de données relationnelles et anomalies de schéma","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fbase-relationnelle","2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle",{"title":491,"path":492,"stem":493},"Le langage SQL","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsql","2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql",{"title":495,"path":496,"stem":497},"Les systèmes de gestion de bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsgbd","2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd",{"title":499,"path":500,"stem":501,"children":502},"Architectures matérielles, systèmes d'exploitation et réseaux","\u002Fnsi-tale\u002Ftc-archi-os-reseaux","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F0.index",[503,504,508,512,516,520,524,528,532],{"title":499,"path":500,"stem":501},{"title":505,"path":506,"stem":507},"Le système sur puce (SoC)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fsysteme-sur-puce","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F1.systeme-sur-puce",{"title":509,"path":510,"stem":511},"Processus et ordonnancement par l'OS","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprocessus-os","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F2.processus-os",{"title":513,"path":514,"stem":515},"L'interblocage (deadlock)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Finterblocage","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F3.interblocage",{"title":517,"path":518,"stem":519},"Principes du routage","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Froutage-principes","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F4.routage-principes",{"title":521,"path":522,"stem":523},"Protocoles de routage RIP et OSPF","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprotocoles-rip-ospf","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F5.protocoles-rip-ospf",{"title":525,"path":526,"stem":527},"Chiffrement symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-symetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F6.chiffrement-symetrique",{"title":529,"path":530,"stem":531},"Chiffrement asymétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-asymetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F7.chiffrement-asymetrique",{"title":533,"path":534,"stem":535},"HTTPS — l'échange de clé symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fhttps-tls","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F8.https-tls",{"title":381,"path":537,"stem":538,"children":539},"\u002Fnsi-tale\u002Ftd-langages-prog","2.nsi-tale\u002Ftd-langages-prog\u002F0.index",[540,541,544,548,552,556],{"title":381,"path":537,"stem":538},{"title":403,"path":542,"stem":543},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point","2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point",{"title":545,"path":546,"stem":547},"Modularité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmodularite","2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite",{"title":549,"path":550,"stem":551},"Récursivité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Frecursivite","2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite",{"title":553,"path":554,"stem":555},"Paradigmes de programmation","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fparadigmes","2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes",{"title":557,"path":558,"stem":559},"Programme comme donnée — calculabilité et indécidabilité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fprogramme-comme-donnee","2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee",{"title":411,"path":561,"stem":562,"children":563},"\u002Fnsi-tale\u002Fte-algorithmique","2.nsi-tale\u002Fte-algorithmique\u002F0.index",[564,565,569,573,577,581],{"title":411,"path":561,"stem":562},{"title":566,"path":567,"stem":568},"Algorithmes sur les arbres binaires","\u002Fnsi-tale\u002Fte-algorithmique\u002Farbres-binaires-algos","2.nsi-tale\u002Fte-algorithmique\u002F1.arbres-binaires-algos",{"title":570,"path":571,"stem":572},"Parcours de graphes — DFS, BFS, cycles, chemins","\u002Fnsi-tale\u002Fte-algorithmique\u002Fgraphes-parcours","2.nsi-tale\u002Fte-algorithmique\u002F2.graphes-parcours",{"title":574,"path":575,"stem":576},"Diviser pour régner","\u002Fnsi-tale\u002Fte-algorithmique\u002Fdiviser-pour-regner","2.nsi-tale\u002Fte-algorithmique\u002F3.diviser-pour-regner",{"title":578,"path":579,"stem":580},"Programmation dynamique","\u002Fnsi-tale\u002Fte-algorithmique\u002Fprogrammation-dynamique","2.nsi-tale\u002Fte-algorithmique\u002F4.programmation-dynamique",{"title":582,"path":583,"stem":584},"Recherche textuelle — l'algorithme de Boyer-Moore","\u002Fnsi-tale\u002Fte-algorithmique\u002Frecherche-textuelle","2.nsi-tale\u002Fte-algorithmique\u002F5.recherche-textuelle",[586,1543,2435,5452,6300],{"id":587,"title":403,"bo":588,"body":590,"description":1529,"eval":1530,"extension":1531,"labo":1530,"meta":1532,"navigation":1123,"path":542,"quizzes":1533,"readingTime":805,"seo":1541,"stem":543,"tp":1530,"__hash__":1542},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.md",[589],"TD01",{"type":591,"value":592,"toc":1516},"minimark",[593,598,615,618,633,637,640,775,789,894,919,923,934,1042,1045,1065,1075,1083,1086,1091,1185,1196,1202,1356,1369,1394,1398,1485,1489,1510,1512],[594,595,597],"h2",{"id":596},"introduction","Introduction",[599,600,601,602,606,607,610,611,614],"p",{},"Un programme qui « tourne » n'est pas un programme qui ",[603,604,605],"strong",{},"fonctionne",". Entre les\ndeux, il y a tout un travail d'",[603,608,609],{},"ingénierie défensive"," : anticiper les cas\nlimites, expliciter les hypothèses, instrumenter le code pour que la moindre\nincohérence se signale d'elle-même. Ce travail est l'objet de l'item\n",[612,613],"bo-ref",{"code":589},".",[599,616,617],{},"Une image utile : du code sans tests, c'est un numéro de trapèze sans filet.\nTant que rien ne dérape, tout va bien — au premier faux pas, plus rien ne\nrattrape. Tests et assertions servent précisément à tendre ce filet.",[599,619,620,621,624,625,628,629,632],{},"Vous connaissez déjà la spécification d'une fonction (chapitre PG) et l'usage\nponctuel des assertions. En Terminale, on systématise : chaque fonction\nexposée doit avoir un ",[603,622,623],{},"contrat"," vérifiable, un ",[603,626,627],{},"jeu de tests"," qui exerce\nses cas limites, et le développeur doit savoir reconnaître les ",[603,630,631],{},"familles de\nbugs récurrentes"," avant qu'elles n'apparaissent en production.",[594,634,636],{"id":635},"les-bugs-typiques-à-reconnaître","Les bugs typiques à reconnaître",[599,638,639],{},"Cinq familles reviennent en boucle :",[641,642,643,659],"table",{},[644,645,646],"thead",{},[647,648,649,653,656],"tr",{},[650,651,652],"th",{},"Famille",[650,654,655],{},"Symptôme",[650,657,658],{},"Exemple",[660,661,662,693,708,731,754],"tbody",{},[647,663,664,670,684],{},[665,666,667],"td",{},[603,668,669],{},"Typage",[665,671,672,673,677,678,677,681,614],{},"Mélange d'",[674,675,676],"code",{},"int",", ",[674,679,680],{},"float",[674,682,683],{},"str",[665,685,686,689,690,614],{},[674,687,688],{},"\"3\" + 4"," lève ",[674,691,692],{},"TypeError",[647,694,695,700,703],{},[665,696,697],{},[603,698,699],{},"Effets de bord",[665,701,702],{},"Une fonction modifie ses arguments mutables.",[665,704,705],{},[674,706,707],{},"def f(l): l.append(0)",[647,709,710,715,722],{},[665,711,712],{},[603,713,714],{},"Hors-bornes",[665,716,717,718,721],{},"Indice de tableau ou borne ",[674,719,720],{},"range"," mal placée.",[665,723,724,727,728,614],{},[674,725,726],{},"range(5)"," produit ",[674,729,730],{},"0..4",[647,732,733,738,744],{},[665,734,735],{},[603,736,737],{},"Conditionnelle non-exhaustive",[665,739,740,741,614],{},"Un cas oublié dans une cascade ",[674,742,743],{},"if\u002Felif",[665,745,746,749,750,753],{},[674,747,748],{},"elif"," sans ",[674,751,752],{},"else"," final.",[647,755,756,761,766],{},[665,757,758],{},[603,759,760],{},"Flottants",[665,762,763,764,614],{},"Comparaison d'égalité entre ",[674,765,680],{},[665,767,768,771,772,614],{},[674,769,770],{},"0.1 + 0.2 == 0.3"," est ",[603,773,774],{},"faux",[776,777,778],"warning",{},[599,779,780,781,784,785,788],{},"La comparaison d'égalité entre flottants est l'un des pièges les plus\nclassiques. Préférez ",[674,782,783],{},"abs(a - b) \u003C epsilon"," pour un ",[674,786,787],{},"epsilon"," adapté à votre\nprécision attendue.",[790,791,792],"python-snippet",{},[793,794,799],"pre",{"className":795,"code":796,"language":797,"meta":798,"style":798},"language-python shiki shiki-themes github-light github-light github-dark","print(0.1 + 0.2)            # 0.30000000000000004\nprint(0.1 + 0.2 == 0.3)     # False\nprint(abs(0.1 + 0.2 - 0.3) \u003C 1e-9)  # True\n","python","",[674,800,801,831,856],{"__ignoreMap":798},[802,803,806,810,814,817,821,824,827],"span",{"class":804,"line":805},"line",1,[802,807,809],{"class":808},"sBjJW","print",[802,811,813],{"class":812},"sxrX7","(",[802,815,816],{"class":808},"0.1",[802,818,820],{"class":819},"s8jYJ"," +",[802,822,823],{"class":808}," 0.2",[802,825,826],{"class":812},")            ",[802,828,830],{"class":829},"sCsY4","# 0.30000000000000004\n",[802,832,834,836,838,840,842,844,847,850,853],{"class":804,"line":833},2,[802,835,809],{"class":808},[802,837,813],{"class":812},[802,839,816],{"class":808},[802,841,820],{"class":819},[802,843,823],{"class":808},[802,845,846],{"class":819}," ==",[802,848,849],{"class":808}," 0.3",[802,851,852],{"class":812},")     ",[802,854,855],{"class":829},"# False\n",[802,857,859,861,863,866,868,870,872,874,877,879,882,885,888,891],{"class":804,"line":858},3,[802,860,809],{"class":808},[802,862,813],{"class":812},[802,864,865],{"class":808},"abs",[802,867,813],{"class":812},[802,869,816],{"class":808},[802,871,820],{"class":819},[802,873,823],{"class":808},[802,875,876],{"class":819}," -",[802,878,849],{"class":808},[802,880,881],{"class":812},") ",[802,883,884],{"class":819},"\u003C",[802,886,887],{"class":808}," 1e-9",[802,889,890],{"class":812},")  ",[802,892,893],{"class":829},"# True\n",[895,896,899,905],"self-eval-qcm",{"correct":897,"slug":898},"1","mise-au-point-c1",[900,901,902],"template",{"v-slot:question":798},[599,903,904],{},"Quelle expression renvoie True ?",[900,906,907],{"v-slot:choices":798},[908,909,910,913,916],"ul",{},[911,912,770],"li",{},[911,914,915],{},"abs(0.1 + 0.2 - 0.3) \u003C 1e-9",[911,917,918],{},"0.1 == 0.10000001",[594,920,922],{"id":921},"les-assertions-durcir-une-fonction","Les assertions — durcir une fonction",[599,924,925,926,929,930,933],{},"Une ",[603,927,928],{},"assertion"," vérifie qu'une condition est vraie à un endroit donné du\nprogramme. Si elle est fausse, Python lève une ",[674,931,932],{},"AssertionError"," immédiatement —\nle bug est attrapé au plus tôt, à l'endroit même où la violation a eu lieu.",[793,935,937],{"className":795,"code":936,"language":797,"meta":798,"style":798},"def division_entiere(a: int, b: int) -> int:\n    \"\"\"Retourne le quotient entier de a par b.\"\"\"\n    assert isinstance(a, int), \"a doit être un entier\"\n    assert isinstance(b, int), \"b doit être un entier\"\n    assert b != 0, \"division par zéro interdite\"\n    return a \u002F\u002F b\n",[674,938,939,966,972,991,1008,1027],{"__ignoreMap":798},[802,940,941,944,948,951,953,956,958,961,963],{"class":804,"line":805},[802,942,943],{"class":819},"def",[802,945,947],{"class":946},"snPdu"," division_entiere",[802,949,950],{"class":812},"(a: ",[802,952,676],{"class":808},[802,954,955],{"class":812},", b: ",[802,957,676],{"class":808},[802,959,960],{"class":812},") -> ",[802,962,676],{"class":808},[802,964,965],{"class":812},":\n",[802,967,968],{"class":804,"line":833},[802,969,971],{"class":970},"sIIMD","    \"\"\"Retourne le quotient entier de a par b.\"\"\"\n",[802,973,974,977,980,983,985,988],{"class":804,"line":858},[802,975,976],{"class":819},"    assert",[802,978,979],{"class":808}," isinstance",[802,981,982],{"class":812},"(a, ",[802,984,676],{"class":808},[802,986,987],{"class":812},"), ",[802,989,990],{"class":970},"\"a doit être un entier\"\n",[802,992,994,996,998,1001,1003,1005],{"class":804,"line":993},4,[802,995,976],{"class":819},[802,997,979],{"class":808},[802,999,1000],{"class":812},"(b, ",[802,1002,676],{"class":808},[802,1004,987],{"class":812},[802,1006,1007],{"class":970},"\"b doit être un entier\"\n",[802,1009,1011,1013,1016,1019,1022,1024],{"class":804,"line":1010},5,[802,1012,976],{"class":819},[802,1014,1015],{"class":812}," b ",[802,1017,1018],{"class":819},"!=",[802,1020,1021],{"class":808}," 0",[802,1023,677],{"class":812},[802,1025,1026],{"class":970},"\"division par zéro interdite\"\n",[802,1028,1030,1033,1036,1039],{"class":804,"line":1029},6,[802,1031,1032],{"class":819},"    return",[802,1034,1035],{"class":812}," a ",[802,1037,1038],{"class":819},"\u002F\u002F",[802,1040,1041],{"class":812}," b\n",[599,1043,1044],{},"Les assertions se placent typiquement :",[908,1046,1047,1053,1059],{},[911,1048,1049,1052],{},[603,1050,1051],{},"en entrée de fonction"," pour valider les pré-conditions (typage, plages\nde valeurs) ;",[911,1054,1055,1058],{},[603,1056,1057],{},"en sortie"," pour vérifier une post-condition (invariant attendu) ;",[911,1060,1061,1064],{},[603,1062,1063],{},"dans une boucle"," pour matérialiser un invariant.",[1066,1067,1068],"tip",{},[599,1069,1070,1071,1074],{},"Une assertion documente le contrat ",[603,1072,1073],{},"et"," le vérifie. Quand un nouvel\nutilisateur appelle votre fonction avec un mauvais argument, l'erreur indique\nexactement quelle hypothèse a été violée.",[594,1076,1078,1079,1082],{"id":1077},"doctests-et-pytest-un-jeu-de-tests-automatisé","Doctests et ",[674,1080,1081],{},"pytest"," — un jeu de tests automatisé",[599,1084,1085],{},"Vérifier à la main qu'une fonction marche après chaque modification est\ninefficace. On automatise.",[1087,1088,1090],"h3",{"id":1089},"doctests-tests-dans-la-docstring","Doctests — tests dans la docstring",[793,1092,1094],{"className":795,"code":1093,"language":797,"meta":798,"style":798},"def double(n: int) -> int:\n    \"\"\"Retourne le double de n.\n\n    >>> double(3)\n    6\n    >>> double(-2)\n    -4\n    >>> double(0)\n    0\n    \"\"\"\n    return 2 * n\n",[674,1095,1096,1114,1119,1125,1133,1138,1145,1151,1159,1165,1171],{"__ignoreMap":798},[802,1097,1098,1100,1103,1106,1108,1110,1112],{"class":804,"line":805},[802,1099,943],{"class":819},[802,1101,1102],{"class":946}," double",[802,1104,1105],{"class":812},"(n: ",[802,1107,676],{"class":808},[802,1109,960],{"class":812},[802,1111,676],{"class":808},[802,1113,965],{"class":812},[802,1115,1116],{"class":804,"line":833},[802,1117,1118],{"class":970},"    \"\"\"Retourne le double de n.\n",[802,1120,1121],{"class":804,"line":858},[802,1122,1124],{"emptyLinePlaceholder":1123},true,"\n",[802,1126,1127,1130],{"class":804,"line":993},[802,1128,1129],{"class":819},"    >>> ",[802,1131,1132],{"class":970},"double(3)\n",[802,1134,1135],{"class":804,"line":1010},[802,1136,1137],{"class":970},"    6\n",[802,1139,1140,1142],{"class":804,"line":1029},[802,1141,1129],{"class":819},[802,1143,1144],{"class":970},"double(-2)\n",[802,1146,1148],{"class":804,"line":1147},7,[802,1149,1150],{"class":970},"    -4\n",[802,1152,1154,1156],{"class":804,"line":1153},8,[802,1155,1129],{"class":819},[802,1157,1158],{"class":970},"double(0)\n",[802,1160,1162],{"class":804,"line":1161},9,[802,1163,1164],{"class":970},"    0\n",[802,1166,1168],{"class":804,"line":1167},10,[802,1169,1170],{"class":970},"    \"\"\"\n",[802,1172,1174,1176,1179,1182],{"class":804,"line":1173},11,[802,1175,1032],{"class":819},[802,1177,1178],{"class":808}," 2",[802,1180,1181],{"class":819}," *",[802,1183,1184],{"class":812}," n\n",[599,1186,1187,1188,1191,1192,1195],{},"Exécution : ",[674,1189,1190],{},"python -m doctest mon_fichier.py -v",". Chaque ligne ",[674,1193,1194],{},">>>"," est\nexécutée et le résultat est comparé à la ligne suivante. Léger et intégré à\nla documentation.",[1087,1197,1199,1201],{"id":1198},"pytest-la-solution-industrielle",[674,1200,1081],{}," — la solution industrielle",[793,1203,1205],{"className":795,"code":1204,"language":797,"meta":798,"style":798},"# fichier test_calculs.py\nfrom calculs import division_entiere\n\ndef test_division_simple():\n    assert division_entiere(10, 3) == 3\n\ndef test_division_negative():\n    assert division_entiere(-7, 2) == -4   # division Python arrondit vers -inf\n\ndef test_division_par_zero():\n    import pytest\n    with pytest.raises(AssertionError):\n        division_entiere(10, 0)\n",[674,1206,1207,1212,1226,1230,1240,1263,1267,1276,1305,1309,1318,1326,1340],{"__ignoreMap":798},[802,1208,1209],{"class":804,"line":805},[802,1210,1211],{"class":829},"# fichier test_calculs.py\n",[802,1213,1214,1217,1220,1223],{"class":804,"line":833},[802,1215,1216],{"class":819},"from",[802,1218,1219],{"class":812}," calculs ",[802,1221,1222],{"class":819},"import",[802,1224,1225],{"class":812}," division_entiere\n",[802,1227,1228],{"class":804,"line":858},[802,1229,1124],{"emptyLinePlaceholder":1123},[802,1231,1232,1234,1237],{"class":804,"line":993},[802,1233,943],{"class":819},[802,1235,1236],{"class":946}," test_division_simple",[802,1238,1239],{"class":812},"():\n",[802,1241,1242,1244,1247,1250,1252,1255,1257,1260],{"class":804,"line":1010},[802,1243,976],{"class":819},[802,1245,1246],{"class":812}," division_entiere(",[802,1248,1249],{"class":808},"10",[802,1251,677],{"class":812},[802,1253,1254],{"class":808},"3",[802,1256,881],{"class":812},[802,1258,1259],{"class":819},"==",[802,1261,1262],{"class":808}," 3\n",[802,1264,1265],{"class":804,"line":1029},[802,1266,1124],{"emptyLinePlaceholder":1123},[802,1268,1269,1271,1274],{"class":804,"line":1147},[802,1270,943],{"class":819},[802,1272,1273],{"class":946}," test_division_negative",[802,1275,1239],{"class":812},[802,1277,1278,1280,1282,1285,1288,1290,1293,1295,1297,1299,1302],{"class":804,"line":1153},[802,1279,976],{"class":819},[802,1281,1246],{"class":812},[802,1283,1284],{"class":819},"-",[802,1286,1287],{"class":808},"7",[802,1289,677],{"class":812},[802,1291,1292],{"class":808},"2",[802,1294,881],{"class":812},[802,1296,1259],{"class":819},[802,1298,876],{"class":819},[802,1300,1301],{"class":808},"4",[802,1303,1304],{"class":829},"   # division Python arrondit vers -inf\n",[802,1306,1307],{"class":804,"line":1161},[802,1308,1124],{"emptyLinePlaceholder":1123},[802,1310,1311,1313,1316],{"class":804,"line":1167},[802,1312,943],{"class":819},[802,1314,1315],{"class":946}," test_division_par_zero",[802,1317,1239],{"class":812},[802,1319,1320,1323],{"class":804,"line":1173},[802,1321,1322],{"class":819},"    import",[802,1324,1325],{"class":812}," pytest\n",[802,1327,1329,1332,1335,1337],{"class":804,"line":1328},12,[802,1330,1331],{"class":819},"    with",[802,1333,1334],{"class":812}," pytest.raises(",[802,1336,932],{"class":808},[802,1338,1339],{"class":812},"):\n",[802,1341,1343,1346,1348,1350,1353],{"class":804,"line":1342},13,[802,1344,1345],{"class":812},"        division_entiere(",[802,1347,1249],{"class":808},[802,1349,677],{"class":812},[802,1351,1352],{"class":808},"0",[802,1354,1355],{"class":812},")\n",[599,1357,1187,1358,1360,1361,1364,1365,1368],{},[674,1359,1081],{},". Le framework découvre tous les fichiers ",[674,1362,1363],{},"test_*.py",",\nexécute toutes les fonctions ",[674,1366,1367],{},"test_*",", et affiche un rapport.",[895,1370,1372,1381],{"correct":897,"slug":1371},"mise-au-point-c2",[900,1373,1374],{"v-slot:question":798},[599,1375,1376,1377,1380],{},"Que vérifie le test ",[674,1378,1379],{},"test_division_par_zero"," ?",[900,1382,1383],{"v-slot:choices":798},[908,1384,1385,1388,1391],{},[911,1386,1387],{},"Que la fonction renvoie 0",[911,1389,1390],{},"Que la fonction lève une AssertionError",[911,1392,1393],{},"Que la fonction renvoie None",[594,1395,1397],{"id":1396},"pièges-récurrents-à-connaître","Pièges récurrents à connaître",[908,1399,1400,1417,1426,1439,1476],{},[911,1401,1402,1411,1412,727,1414,614],{},[603,1403,1404,1407,1408],{},[674,1405,1406],{},"range(n)"," est exclusif sur ",[674,1409,1410],{},"n"," : ",[674,1413,726],{},[674,1415,1416],{},"0, 1, 2, 3, 4",[911,1418,1419,1411,1422,1425],{},[603,1420,1421],{},"Indices Python à partir de 0",[674,1423,1424],{},"t[len(t)]"," est toujours hors-bornes.",[911,1427,1428,1411,1431,1434,1435,1438],{},[603,1429,1430],{},"Comparaison de chaînes vs nombres",[674,1432,1433],{},"\"10\" \u003C \"9\""," vaut ",[674,1436,1437],{},"True"," (ordre\nlexicographique).",[911,1440,1441,1411,1444,1447,1448,1451,1452,1455,1456,1459,1460,1463,1464,1467,1468,1471,1472,1475],{},[603,1442,1443],{},"Argument mutable par défaut",[674,1445,1446],{},"def f(l=[])"," partage la ",[603,1449,1450],{},"même"," liste\nentre tous les appels. Le pattern canonique est ",[674,1453,1454],{},"def f(l=None)"," puis, dans\nle corps, ",[674,1457,1458],{},"if l is None: l = []",". (À éviter : l'idiome raccourci\n",[674,1461,1462],{},"l = l or []"," traite ",[603,1465,1466],{},"toute"," valeur falsy — y compris une liste vide\npassée volontairement par l'appelant — comme un cas « non fourni » et\nla remplace par une ",[603,1469,1470],{},"nouvelle"," liste. C'est rarement ce qu'on veut\nquand ",[674,1473,1474],{},"l"," doit être muté en place.)",[911,1477,1478,1484],{},[603,1479,1480,749,1482],{},[674,1481,748],{},[674,1483,752],{}," : un cas oublié = comportement silencieux indéfini.",[594,1486,1488],{"id":1487},"pour-aller-plus-loin","Pour aller plus loin",[599,1490,1491,1492,1495,1496,1498,1499,1502,1503,1506,1507,1509],{},"Le module standard ",[674,1493,1494],{},"logging"," permet d'instrumenter un programme sans recourir\nà des ",[674,1497,809],{}," qu'on devra supprimer. Le typage est renforcé statiquement par\n",[674,1500,1501],{},"mypy",", qui détecte les erreurs de type ",[603,1504,1505],{},"avant l'exécution",". Et ",[674,1508,1081],{},"\ngère paramétrisation, fixtures et couverture de code.",[612,1511],{"code":589},[1513,1514,1515],"style",{},"html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":798,"searchDepth":833,"depth":833,"links":1517},[1518,1519,1520,1521,1527,1528],{"id":596,"depth":833,"text":597},{"id":635,"depth":833,"text":636},{"id":921,"depth":833,"text":922},{"id":1077,"depth":833,"text":1522,"children":1523},"Doctests et pytest — un jeu de tests automatisé",[1524,1525],{"id":1089,"depth":858,"text":1090},{"id":1198,"depth":858,"text":1526},"pytest — la solution industrielle",{"id":1396,"depth":833,"text":1397},{"id":1487,"depth":833,"text":1488},"Anticiper les bugs typiques, durcir le code par des assertions, des doctests et des jeux de tests automatisés.",null,"md",{},[1534,1538],{"slug":898,"kind":1535,"question":904,"choices":1536,"correct":897,"multi":1537,"explanation":798},"qcm",[770,915,918],false,{"slug":1371,"kind":1535,"question":1539,"choices":1540,"correct":897,"multi":1537,"explanation":798},"Que vérifie le test test_division_par_zero ?",[1387,1390,1393],{"title":403,"description":1529},"_qfFbhGjENLt0a2Y1MxB1d3kgUILW-p3MNca_HFtwuE",{"id":1544,"title":545,"bo":1545,"body":1547,"description":2425,"eval":1530,"extension":1531,"labo":1530,"meta":2426,"navigation":1123,"path":546,"quizzes":2427,"readingTime":805,"seo":2433,"stem":547,"tp":1530,"__hash__":2434},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite.md",[1546],"TD02",{"type":591,"value":1548,"toc":2416},[1549,1551,1569,1583,1594,1598,1686,1717,1721,1781,1794,1819,1823,1830,1853,1914,1929,1936,1939,2271,2274,2350,2358,2379,2381,2411,2413],[594,1550,597],{"id":596},[599,1552,1553,1554,1557,1558,1561,1562,1565,1566,614],{},"Un programme sérieux ne tient pas dans un seul fichier. Au-delà de quelques\ncentaines de lignes, il devient illisible et coûteux à maintenir. On\n",[603,1555,1556],{},"découpe"," alors le code en unités cohérentes — les ",[603,1559,1560],{},"modules"," — chacune\nresponsable d'un domaine, chacune ",[603,1563,1564],{},"documentée"," et ",[603,1567,1568],{},"réutilisable",[599,1570,1571,1572,1574,1575,1578,1579,1582],{},"Cette discipline est l'objet de l'item ",[612,1573],{"code":1546},". Elle suppose deux\ncompétences complémentaires : savoir ",[603,1576,1577],{},"consommer"," une bibliothèque\n(comprendre sa documentation, l'utiliser correctement) et savoir\n",[603,1580,1581],{},"produire"," ses propres modules, documentés à un niveau tel qu'un tiers\npuisse les utiliser sans lire le code source.",[599,1584,1585,1586,1589,1590,1593],{},"Une bibliothèque, c'est un ",[603,1587,1588],{},"atelier d'outils prêts à l'emploi"," : vous\nn'allez pas refondre un marteau à chaque clou à planter. Documenter votre\npropre module, c'est laisser un ",[603,1591,1592],{},"mode d'emploi"," pour celui qui ouvrira la\nboîte après vous — souvent vous-même dans six mois.",[594,1595,1597],{"id":1596},"modules-packages-bibliothèques","Modules, packages, bibliothèques",[641,1599,1600,1612],{},[644,1601,1602],{},[647,1603,1604,1607,1610],{},[650,1605,1606],{},"Terme",[650,1608,1609],{},"Définition",[650,1611,658],{},[660,1613,1614,1633,1652,1671],{},[647,1615,1616,1621,1628],{},[665,1617,1618],{},[603,1619,1620],{},"Module",[665,1622,1623,1624,1627],{},"Un fichier ",[674,1625,1626],{},".py"," qu'on peut importer.",[665,1629,1630],{},[674,1631,1632],{},"math.py",[647,1634,1635,1640,1647],{},[665,1636,1637],{},[603,1638,1639],{},"Package",[665,1641,1642,1643,1646],{},"Un dossier contenant un ",[674,1644,1645],{},"__init__.py"," et plusieurs modules.",[665,1648,1649],{},[674,1650,1651],{},"numpy\u002F",[647,1653,1654,1660,1663],{},[665,1655,1656,1659],{},[603,1657,1658],{},"Bibliothèque"," (lib)",[665,1661,1662],{},"Ensemble de modules\u002Fpackages fournis ensemble.",[665,1664,1665,677,1668],{},[674,1666,1667],{},"numpy",[674,1669,1670],{},"requests",[647,1672,1673,1678,1681],{},[665,1674,1675],{},[603,1676,1677],{},"API",[665,1679,1680],{},"Surface publique exposée par une bibliothèque (fonctions, classes).",[665,1682,1683],{},[674,1684,1685],{},"numpy.array(...)",[1687,1688,1689],"note",{},[599,1690,1691,1692,1695,1696,677,1699,677,1702,677,1705,1708,1709,1712,1713,1716],{},"La ",[603,1693,1694],{},"bibliothèque standard"," de Python regroupe des centaines de modules livrés\navec l'interpréteur (",[674,1697,1698],{},"math",[674,1700,1701],{},"random",[674,1703,1704],{},"os",[674,1706,1707],{},"json",", …). Les bibliothèques\n",[603,1710,1711],{},"tierces"," s'installent via ",[674,1714,1715],{},"pip"," depuis PyPI.",[594,1718,1720],{"id":1719},"importer-quatre-syntaxes-utiles","Importer — quatre syntaxes utiles",[793,1722,1724],{"className":795,"code":1723,"language":797,"meta":798,"style":798},"import math                            # accès via math.sqrt(2)\nfrom math import sqrt                  # accès direct sqrt(2)\nfrom math import sqrt, pi              # plusieurs symboles\nimport numpy as np                     # alias court\n",[674,1725,1726,1736,1751,1765],{"__ignoreMap":798},[802,1727,1728,1730,1733],{"class":804,"line":805},[802,1729,1222],{"class":819},[802,1731,1732],{"class":812}," math                            ",[802,1734,1735],{"class":829},"# accès via math.sqrt(2)\n",[802,1737,1738,1740,1743,1745,1748],{"class":804,"line":833},[802,1739,1216],{"class":819},[802,1741,1742],{"class":812}," math ",[802,1744,1222],{"class":819},[802,1746,1747],{"class":812}," sqrt                  ",[802,1749,1750],{"class":829},"# accès direct sqrt(2)\n",[802,1752,1753,1755,1757,1759,1762],{"class":804,"line":858},[802,1754,1216],{"class":819},[802,1756,1742],{"class":812},[802,1758,1222],{"class":819},[802,1760,1761],{"class":812}," sqrt, pi              ",[802,1763,1764],{"class":829},"# plusieurs symboles\n",[802,1766,1767,1769,1772,1775,1778],{"class":804,"line":993},[802,1768,1222],{"class":819},[802,1770,1771],{"class":812}," numpy ",[802,1773,1774],{"class":819},"as",[802,1776,1777],{"class":812}," np                     ",[802,1779,1780],{"class":829},"# alias court\n",[776,1782,1783],{},[599,1784,1785,1786,1789,1790,1793],{},"Évitez ",[674,1787,1788],{},"from math import *"," : il ",[603,1791,1792],{},"pollue"," l'espace de noms et masque\nsilencieusement les variables locales qui auraient le même nom.",[895,1795,1797,1806],{"correct":897,"slug":1796},"modularite-c1",[900,1798,1799],{"v-slot:question":798},[599,1800,1801,1802,1805],{},"Quelle ligne permet d'écrire ",[674,1803,1804],{},"sqrt(2)"," directement ?",[900,1807,1808],{"v-slot:choices":798},[908,1809,1810,1813,1816],{},[911,1811,1812],{},"import math",[911,1814,1815],{},"from math import sqrt",[911,1817,1818],{},"import math as sqrt",[594,1820,1822],{"id":1821},"exploiter-la-documentation","Exploiter la documentation",[599,1824,1825,1826,1829],{},"Toute bibliothèque sérieuse expose ",[603,1827,1828],{},"trois niveaux"," de documentation :",[1831,1832,1833,1841,1847],"ol",{},[911,1834,1835,1840],{},[603,1836,1837],{},[674,1838,1839],{},"help(objet)"," dans l'interpréteur — affiche la docstring de l'objet.",[911,1842,1843,1846],{},[603,1844,1845],{},"La documentation en ligne"," — référence officielle, tutoriels, exemples.",[911,1848,1849,1852],{},[603,1850,1851],{},"Le code source"," — pour les cas extrêmes, mais à éviter en première\napproche.",[793,1854,1856],{"className":795,"code":1855,"language":797,"meta":798,"style":798},">>> import math\n>>> help(math.sqrt)\nHelp on built-in function sqrt in module math:\n\nsqrt(x, \u002F)\n    Return the square root of x.\n",[674,1857,1858,1868,1878,1895,1899,1909],{"__ignoreMap":798},[802,1859,1860,1862,1865],{"class":804,"line":805},[802,1861,1194],{"class":819},[802,1863,1864],{"class":819}," import",[802,1866,1867],{"class":812}," math\n",[802,1869,1870,1872,1875],{"class":804,"line":833},[802,1871,1194],{"class":819},[802,1873,1874],{"class":808}," help",[802,1876,1877],{"class":812},"(math.sqrt)\n",[802,1879,1880,1883,1886,1889,1892],{"class":804,"line":858},[802,1881,1882],{"class":812},"Help on built",[802,1884,1885],{"class":819},"-in",[802,1887,1888],{"class":812}," function sqrt ",[802,1890,1891],{"class":819},"in",[802,1893,1894],{"class":812}," module math:\n",[802,1896,1897],{"class":804,"line":993},[802,1898,1124],{"emptyLinePlaceholder":1123},[802,1900,1901,1904,1907],{"class":804,"line":1010},[802,1902,1903],{"class":812},"sqrt(x, ",[802,1905,1906],{"class":819},"\u002F",[802,1908,1355],{"class":812},[802,1910,1911],{"class":804,"line":1029},[802,1912,1913],{"class":812},"    Return the square root of x.\n",[599,1915,1916,1917,1920,1921,1924,1925,1928],{},"Devant une fonction inconnue, le réflexe est ",[674,1918,1919],{},"help(...)"," ou ",[674,1922,1923],{},"?"," dans Jupyter,\n",[603,1926,1927],{},"avant"," Stack Overflow.",[594,1930,1932,1933],{"id":1931},"créer-son-propre-module-geompy","Créer son propre module — ",[674,1934,1935],{},"geom.py",[599,1937,1938],{},"Le meilleur moyen d'apprendre est d'en écrire un. Voici un module minimaliste\nde géométrie :",[793,1940,1942],{"className":795,"code":1941,"language":797,"meta":798,"style":798},"# fichier geom.py\n\"\"\"Module geom — primitives géométriques pour figures simples.\n\nCe module fournit des fonctions pour calculer l'aire et le périmètre\nde figures usuelles (cercle, rectangle, triangle).\n\"\"\"\n\nfrom math import pi\n\n\ndef aire_cercle(rayon: float) -> float:\n    \"\"\"Retourne l'aire d'un cercle de rayon donné.\n\n    >>> round(aire_cercle(1), 4)\n    3.1416\n    \"\"\"\n    assert rayon >= 0, \"le rayon doit être positif\"\n    return pi * rayon ** 2\n\n\ndef perimetre_cercle(rayon: float) -> float:\n    \"\"\"Retourne le périmètre (circonférence) d'un cercle.\n\n    >>> round(perimetre_cercle(1), 4)\n    6.2832\n    \"\"\"\n    assert rayon >= 0, \"le rayon doit être positif\"\n    return 2 * pi * rayon\n\n\ndef aire_rectangle(largeur: float, hauteur: float) -> float:\n    \"\"\"Retourne l'aire d'un rectangle.\n\n    >>> aire_rectangle(3, 4)\n    12\n    \"\"\"\n    assert largeur >= 0 and hauteur >= 0, \"dimensions positives\"\n    return largeur * hauteur\n",[674,1943,1944,1949,1954,1958,1963,1968,1973,1977,1988,1992,1996,2014,2019,2023,2031,2037,2042,2060,2079,2084,2089,2107,2113,2118,2126,2132,2137,2152,2168,2173,2178,2202,2208,2213,2221,2227,2232,2259],{"__ignoreMap":798},[802,1945,1946],{"class":804,"line":805},[802,1947,1948],{"class":829},"# fichier geom.py\n",[802,1950,1951],{"class":804,"line":833},[802,1952,1953],{"class":970},"\"\"\"Module geom — primitives géométriques pour figures simples.\n",[802,1955,1956],{"class":804,"line":858},[802,1957,1124],{"emptyLinePlaceholder":1123},[802,1959,1960],{"class":804,"line":993},[802,1961,1962],{"class":970},"Ce module fournit des fonctions pour calculer l'aire et le périmètre\n",[802,1964,1965],{"class":804,"line":1010},[802,1966,1967],{"class":970},"de figures usuelles (cercle, rectangle, triangle).\n",[802,1969,1970],{"class":804,"line":1029},[802,1971,1972],{"class":970},"\"\"\"\n",[802,1974,1975],{"class":804,"line":1147},[802,1976,1124],{"emptyLinePlaceholder":1123},[802,1978,1979,1981,1983,1985],{"class":804,"line":1153},[802,1980,1216],{"class":819},[802,1982,1742],{"class":812},[802,1984,1222],{"class":819},[802,1986,1987],{"class":812}," pi\n",[802,1989,1990],{"class":804,"line":1161},[802,1991,1124],{"emptyLinePlaceholder":1123},[802,1993,1994],{"class":804,"line":1167},[802,1995,1124],{"emptyLinePlaceholder":1123},[802,1997,1998,2000,2003,2006,2008,2010,2012],{"class":804,"line":1173},[802,1999,943],{"class":819},[802,2001,2002],{"class":946}," aire_cercle",[802,2004,2005],{"class":812},"(rayon: ",[802,2007,680],{"class":808},[802,2009,960],{"class":812},[802,2011,680],{"class":808},[802,2013,965],{"class":812},[802,2015,2016],{"class":804,"line":1328},[802,2017,2018],{"class":970},"    \"\"\"Retourne l'aire d'un cercle de rayon donné.\n",[802,2020,2021],{"class":804,"line":1342},[802,2022,1124],{"emptyLinePlaceholder":1123},[802,2024,2026,2028],{"class":804,"line":2025},14,[802,2027,1129],{"class":819},[802,2029,2030],{"class":970},"round(aire_cercle(1), 4)\n",[802,2032,2034],{"class":804,"line":2033},15,[802,2035,2036],{"class":970},"    3.1416\n",[802,2038,2040],{"class":804,"line":2039},16,[802,2041,1170],{"class":970},[802,2043,2045,2047,2050,2053,2055,2057],{"class":804,"line":2044},17,[802,2046,976],{"class":819},[802,2048,2049],{"class":812}," rayon ",[802,2051,2052],{"class":819},">=",[802,2054,1021],{"class":808},[802,2056,677],{"class":812},[802,2058,2059],{"class":970},"\"le rayon doit être positif\"\n",[802,2061,2063,2065,2068,2071,2073,2076],{"class":804,"line":2062},18,[802,2064,1032],{"class":819},[802,2066,2067],{"class":812}," pi ",[802,2069,2070],{"class":819},"*",[802,2072,2049],{"class":812},[802,2074,2075],{"class":819},"**",[802,2077,2078],{"class":808}," 2\n",[802,2080,2082],{"class":804,"line":2081},19,[802,2083,1124],{"emptyLinePlaceholder":1123},[802,2085,2087],{"class":804,"line":2086},20,[802,2088,1124],{"emptyLinePlaceholder":1123},[802,2090,2092,2094,2097,2099,2101,2103,2105],{"class":804,"line":2091},21,[802,2093,943],{"class":819},[802,2095,2096],{"class":946}," perimetre_cercle",[802,2098,2005],{"class":812},[802,2100,680],{"class":808},[802,2102,960],{"class":812},[802,2104,680],{"class":808},[802,2106,965],{"class":812},[802,2108,2110],{"class":804,"line":2109},22,[802,2111,2112],{"class":970},"    \"\"\"Retourne le périmètre (circonférence) d'un cercle.\n",[802,2114,2116],{"class":804,"line":2115},23,[802,2117,1124],{"emptyLinePlaceholder":1123},[802,2119,2121,2123],{"class":804,"line":2120},24,[802,2122,1129],{"class":819},[802,2124,2125],{"class":970},"round(perimetre_cercle(1), 4)\n",[802,2127,2129],{"class":804,"line":2128},25,[802,2130,2131],{"class":970},"    6.2832\n",[802,2133,2135],{"class":804,"line":2134},26,[802,2136,1170],{"class":970},[802,2138,2140,2142,2144,2146,2148,2150],{"class":804,"line":2139},27,[802,2141,976],{"class":819},[802,2143,2049],{"class":812},[802,2145,2052],{"class":819},[802,2147,1021],{"class":808},[802,2149,677],{"class":812},[802,2151,2059],{"class":970},[802,2153,2155,2157,2159,2161,2163,2165],{"class":804,"line":2154},28,[802,2156,1032],{"class":819},[802,2158,1178],{"class":808},[802,2160,1181],{"class":819},[802,2162,2067],{"class":812},[802,2164,2070],{"class":819},[802,2166,2167],{"class":812}," rayon\n",[802,2169,2171],{"class":804,"line":2170},29,[802,2172,1124],{"emptyLinePlaceholder":1123},[802,2174,2176],{"class":804,"line":2175},30,[802,2177,1124],{"emptyLinePlaceholder":1123},[802,2179,2181,2183,2186,2189,2191,2194,2196,2198,2200],{"class":804,"line":2180},31,[802,2182,943],{"class":819},[802,2184,2185],{"class":946}," aire_rectangle",[802,2187,2188],{"class":812},"(largeur: ",[802,2190,680],{"class":808},[802,2192,2193],{"class":812},", hauteur: ",[802,2195,680],{"class":808},[802,2197,960],{"class":812},[802,2199,680],{"class":808},[802,2201,965],{"class":812},[802,2203,2205],{"class":804,"line":2204},32,[802,2206,2207],{"class":970},"    \"\"\"Retourne l'aire d'un rectangle.\n",[802,2209,2211],{"class":804,"line":2210},33,[802,2212,1124],{"emptyLinePlaceholder":1123},[802,2214,2216,2218],{"class":804,"line":2215},34,[802,2217,1129],{"class":819},[802,2219,2220],{"class":970},"aire_rectangle(3, 4)\n",[802,2222,2224],{"class":804,"line":2223},35,[802,2225,2226],{"class":970},"    12\n",[802,2228,2230],{"class":804,"line":2229},36,[802,2231,1170],{"class":970},[802,2233,2235,2237,2240,2242,2244,2247,2250,2252,2254,2256],{"class":804,"line":2234},37,[802,2236,976],{"class":819},[802,2238,2239],{"class":812}," largeur ",[802,2241,2052],{"class":819},[802,2243,1021],{"class":808},[802,2245,2246],{"class":819}," and",[802,2248,2249],{"class":812}," hauteur ",[802,2251,2052],{"class":819},[802,2253,1021],{"class":808},[802,2255,677],{"class":812},[802,2257,2258],{"class":970},"\"dimensions positives\"\n",[802,2260,2262,2264,2266,2268],{"class":804,"line":2261},38,[802,2263,1032],{"class":819},[802,2265,2239],{"class":812},[802,2267,2070],{"class":819},[802,2269,2270],{"class":812}," hauteur\n",[599,2272,2273],{},"L'utiliser depuis un autre script :",[793,2275,2277],{"className":795,"code":2276,"language":797,"meta":798,"style":798},"# fichier main.py\nimport geom\n\nprint(geom.aire_cercle(2))             # 12.566370614359172\nprint(geom.aire_rectangle(3, 4))       # 12\nhelp(geom)                             # affiche la docstring du module\nhelp(geom.aire_cercle)                 # affiche la docstring de la fonction\n",[674,2278,2279,2284,2291,2295,2310,2329,2340],{"__ignoreMap":798},[802,2280,2281],{"class":804,"line":805},[802,2282,2283],{"class":829},"# fichier main.py\n",[802,2285,2286,2288],{"class":804,"line":833},[802,2287,1222],{"class":819},[802,2289,2290],{"class":812}," geom\n",[802,2292,2293],{"class":804,"line":858},[802,2294,1124],{"emptyLinePlaceholder":1123},[802,2296,2297,2299,2302,2304,2307],{"class":804,"line":993},[802,2298,809],{"class":808},[802,2300,2301],{"class":812},"(geom.aire_cercle(",[802,2303,1292],{"class":808},[802,2305,2306],{"class":812},"))             ",[802,2308,2309],{"class":829},"# 12.566370614359172\n",[802,2311,2312,2314,2317,2319,2321,2323,2326],{"class":804,"line":1010},[802,2313,809],{"class":808},[802,2315,2316],{"class":812},"(geom.aire_rectangle(",[802,2318,1254],{"class":808},[802,2320,677],{"class":812},[802,2322,1301],{"class":808},[802,2324,2325],{"class":812},"))       ",[802,2327,2328],{"class":829},"# 12\n",[802,2330,2331,2334,2337],{"class":804,"line":1029},[802,2332,2333],{"class":808},"help",[802,2335,2336],{"class":812},"(geom)                             ",[802,2338,2339],{"class":829},"# affiche la docstring du module\n",[802,2341,2342,2344,2347],{"class":804,"line":1147},[802,2343,2333],{"class":808},[802,2345,2346],{"class":812},"(geom.aire_cercle)                 ",[802,2348,2349],{"class":829},"# affiche la docstring de la fonction\n",[1066,2351,2352],{},[599,2353,2354,2357],{},[603,2355,2356],{},"Quatre éléments font un module utilisable"," : une docstring de module, une\ndocstring par fonction publique, un typage clair des paramètres, et des\nexemples dans les docstrings (qui servent aussi de doctests).",[895,2359,2361,2366],{"correct":897,"slug":2360},"modularite-c2",[900,2362,2363],{"v-slot:question":798},[599,2364,2365],{},"Quel élément est ABSENT du module geom.py qui le rendrait moins fiable ?",[900,2367,2368],{"v-slot:choices":798},[908,2369,2370,2373,2376],{},[911,2371,2372],{},"Une docstring de module",[911,2374,2375],{},"Un jeu de tests externe",[911,2377,2378],{},"Des assertions sur les arguments",[594,2380,1488],{"id":1487},[599,2382,2383,2384,2387,2388,2391,2392,2395,2396,2399,2400,2403,2404,2407,2408,614],{},"Un module mature s'accompagne d'un ",[674,2385,2386],{},"__main__"," qui permet de l'exécuter\ndirectement (",[674,2389,2390],{},"python geom.py","), de tests dans un fichier ",[674,2393,2394],{},"test_geom.py",", et\nd'un ",[674,2397,2398],{},"README.md"," qui décrit le projet. Au-delà, on ",[603,2401,2402],{},"package"," le tout\n(",[674,2405,2406],{},"pyproject.toml",") pour le publier sur PyPI et le rendre installable par\n",[674,2409,2410],{},"pip install",[612,2412],{"code":1546},[1513,2414,2415],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":798,"searchDepth":833,"depth":833,"links":2417},[2418,2419,2420,2421,2422,2424],{"id":596,"depth":833,"text":597},{"id":1596,"depth":833,"text":1597},{"id":1719,"depth":833,"text":1720},{"id":1821,"depth":833,"text":1822},{"id":1931,"depth":833,"text":2423},"Créer son propre module — geom.py",{"id":1487,"depth":833,"text":1488},"Structurer le code en modules et packages, exploiter les bibliothèques et leur documentation, créer un module documenté réutilisable.",{},[2428,2431],{"slug":1796,"kind":1535,"question":2429,"choices":2430,"correct":897,"multi":1537,"explanation":798},"Quelle ligne permet d'écrire sqrt(2) directement ?",[1812,1815,1818],{"slug":2360,"kind":1535,"question":2365,"choices":2432,"correct":897,"multi":1537,"explanation":798},[2372,2375,2378],{"title":545,"description":2425},"Fz-nTqFMmzoDLKSCdyYEuXzjzelsqIzOknK6IYUTIyU",{"id":2436,"title":549,"bo":2437,"body":2439,"description":5443,"eval":1530,"extension":1531,"labo":1530,"meta":5444,"navigation":1123,"path":550,"quizzes":5445,"readingTime":805,"seo":5450,"stem":551,"tp":1530,"__hash__":5451},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite.md",[2438],"TD05",{"type":591,"value":2440,"toc":5433},[2441,2443,2452,2463,2478,2482,2485,2507,2513,2635,2657,2740,2744,2763,2771,3030,3050,3068,3072,3133,3358,3750,3754,4189,4268,4275,4476,4853,4871,4994,5048,5181,5184,5281,5289,5371,5382,5394,5415,5417,5428,5430],[594,2442,597],{"id":596},[599,2444,2445,2446,2449,2450,614],{},"Une fonction ",[603,2447,2448],{},"récursive"," est une fonction qui s'appelle elle-même. Cette\nnotion d'auto-référence, étrangère au calcul itératif, est l'un des outils les\nplus puissants du programmeur — et l'un des plus subtils à analyser. Elle est\nle cœur de l'item ",[612,2451],{"code":2438},[599,2453,2454,2455,2458,2459,2462],{},"Beaucoup de problèmes ont une ",[603,2456,2457],{},"structure récursive naturelle"," : la taille\nd'un arbre, le parcours d'un graphe, le calcul d'une factorielle, la\ndécomposition d'un problème en sous-problèmes plus petits. Écrire la solution\nrécursive est souvent plus court et plus lisible que sa version itérative —\nmais l'",[603,2460,2461],{},"analyse de coût"," demande un outillage spécifique.",[599,2464,2465,2466,2469,2470,2473,2474,2477],{},"L'idée est partout dans la culture : les ",[603,2467,2468],{},"matriochkas"," russes (chaque poupée\ncontient une poupée plus petite, jusqu'à une dernière insécable), l'",[603,2471,2472],{},"effet\nDroste"," (la vieille boîte de cacao Van Houten où une infirmière tient une\nboîte… qui contient l'infirmière qui tient la boîte), ou encore la\n",[603,2475,2476],{},"fractale de Sierpinski"," (chaque triangle est composé de trois triangles\nidentiques à plus petite échelle).",[594,2479,2481],{"id":2480},"anatomie-dune-fonction-récursive","Anatomie d'une fonction récursive",[599,2483,2484],{},"Toute fonction récursive bien formée a deux ingrédients :",[1831,2486,2487,2497],{},[911,2488,2489,2492,2493,2496],{},[603,2490,2491],{},"Un ou plusieurs cas de base"," — une situation où la fonction retourne\ndirectement, ",[603,2494,2495],{},"sans s'appeler",". C'est la condition de terminaison.",[911,2498,2499,2502,2503,2506],{},[603,2500,2501],{},"Un cas récursif"," — la fonction se rappelle sur une entrée ",[603,2504,2505],{},"strictement\nplus petite"," (au sens d'un ordre bien fondé), et combine le résultat.",[599,2508,2509,2510,614],{},"Exemple canonique : la ",[603,2511,2512],{},"factorielle",[793,2514,2516],{"className":795,"code":2515,"language":797,"meta":798,"style":798},"def factorielle(n: int) -> int:\n    \"\"\"Calcule n! par récurrence.\n\n    >>> factorielle(0)\n    1\n    >>> factorielle(5)\n    120\n    \"\"\"\n    assert n >= 0, \"n doit être positif ou nul\"\n    if n == 0:              # cas de base\n        return 1\n    return n * factorielle(n - 1)   # cas récursif\n",[674,2517,2518,2535,2540,2544,2551,2556,2563,2568,2572,2588,2605,2613],{"__ignoreMap":798},[802,2519,2520,2522,2525,2527,2529,2531,2533],{"class":804,"line":805},[802,2521,943],{"class":819},[802,2523,2524],{"class":946}," factorielle",[802,2526,1105],{"class":812},[802,2528,676],{"class":808},[802,2530,960],{"class":812},[802,2532,676],{"class":808},[802,2534,965],{"class":812},[802,2536,2537],{"class":804,"line":833},[802,2538,2539],{"class":970},"    \"\"\"Calcule n! par récurrence.\n",[802,2541,2542],{"class":804,"line":858},[802,2543,1124],{"emptyLinePlaceholder":1123},[802,2545,2546,2548],{"class":804,"line":993},[802,2547,1129],{"class":819},[802,2549,2550],{"class":970},"factorielle(0)\n",[802,2552,2553],{"class":804,"line":1010},[802,2554,2555],{"class":970},"    1\n",[802,2557,2558,2560],{"class":804,"line":1029},[802,2559,1129],{"class":819},[802,2561,2562],{"class":970},"factorielle(5)\n",[802,2564,2565],{"class":804,"line":1147},[802,2566,2567],{"class":970},"    120\n",[802,2569,2570],{"class":804,"line":1153},[802,2571,1170],{"class":970},[802,2573,2574,2576,2579,2581,2583,2585],{"class":804,"line":1161},[802,2575,976],{"class":819},[802,2577,2578],{"class":812}," n ",[802,2580,2052],{"class":819},[802,2582,1021],{"class":808},[802,2584,677],{"class":812},[802,2586,2587],{"class":970},"\"n doit être positif ou nul\"\n",[802,2589,2590,2593,2595,2597,2599,2602],{"class":804,"line":1167},[802,2591,2592],{"class":819},"    if",[802,2594,2578],{"class":812},[802,2596,1259],{"class":819},[802,2598,1021],{"class":808},[802,2600,2601],{"class":812},":              ",[802,2603,2604],{"class":829},"# cas de base\n",[802,2606,2607,2610],{"class":804,"line":1173},[802,2608,2609],{"class":819},"        return",[802,2611,2612],{"class":808}," 1\n",[802,2614,2615,2617,2619,2621,2624,2626,2629,2632],{"class":804,"line":1328},[802,2616,1032],{"class":819},[802,2618,2578],{"class":812},[802,2620,2070],{"class":819},[802,2622,2623],{"class":812}," factorielle(n ",[802,2625,1284],{"class":819},[802,2627,2628],{"class":808}," 1",[802,2630,2631],{"class":812},")   ",[802,2633,2634],{"class":829},"# cas récursif\n",[1687,2636,2637],{},[599,2638,1691,2639,2642,2643,2645,2646,2649,2650,2653,2654,614],{},[603,2640,2641],{},"terminaison"," est garantie ici car chaque appel diminue strictement ",[674,2644,1410],{},",\net ",[674,2647,2648],{},"n == 0"," est le cas de base. Sans cas de base, ou si l'appel récursif ne\nréduit pas l'entrée, on obtient une ",[603,2651,2652],{},"récursion infinie"," — Python finit par\nlever ",[674,2655,2656],{},"RecursionError",[790,2658,2659],{},[793,2660,2662],{"className":795,"code":2661,"language":797,"meta":798,"style":798},"def factorielle(n):\n    if n == 0:\n        return 1\n    return n * factorielle(n - 1)\n\nprint(factorielle(5))       # 120\nprint(factorielle(10))      # 3628800\n",[674,2663,2664,2673,2685,2691,2707,2711,2726],{"__ignoreMap":798},[802,2665,2666,2668,2670],{"class":804,"line":805},[802,2667,943],{"class":819},[802,2669,2524],{"class":946},[802,2671,2672],{"class":812},"(n):\n",[802,2674,2675,2677,2679,2681,2683],{"class":804,"line":833},[802,2676,2592],{"class":819},[802,2678,2578],{"class":812},[802,2680,1259],{"class":819},[802,2682,1021],{"class":808},[802,2684,965],{"class":812},[802,2686,2687,2689],{"class":804,"line":858},[802,2688,2609],{"class":819},[802,2690,2612],{"class":808},[802,2692,2693,2695,2697,2699,2701,2703,2705],{"class":804,"line":993},[802,2694,1032],{"class":819},[802,2696,2578],{"class":812},[802,2698,2070],{"class":819},[802,2700,2623],{"class":812},[802,2702,1284],{"class":819},[802,2704,2628],{"class":808},[802,2706,1355],{"class":812},[802,2708,2709],{"class":804,"line":1010},[802,2710,1124],{"emptyLinePlaceholder":1123},[802,2712,2713,2715,2718,2721,2723],{"class":804,"line":1029},[802,2714,809],{"class":808},[802,2716,2717],{"class":812},"(factorielle(",[802,2719,2720],{"class":808},"5",[802,2722,2325],{"class":812},[802,2724,2725],{"class":829},"# 120\n",[802,2727,2728,2730,2732,2734,2737],{"class":804,"line":1147},[802,2729,809],{"class":808},[802,2731,2717],{"class":812},[802,2733,1249],{"class":808},[802,2735,2736],{"class":812},"))      ",[802,2738,2739],{"class":829},"# 3628800\n",[594,2741,2743],{"id":2742},"la-pile-dappels-ce-qui-se-passe-vraiment","La pile d'appels — ce qui se passe vraiment",[599,2745,2746,2747,2750,2751,2754,2755,2758,2759,2762],{},"Chaque appel de fonction empile un ",[603,2748,2749],{},"cadre d'activation"," sur la ",[603,2752,2753],{},"pile\nd'appels"," (stack en anglais). On l'imagine comme une ",[603,2756,2757],{},"pile d'assiettes"," dans\nun placard : on ne pose et on ne retire qu'au sommet, et l'assiette tout en\nbas — le premier appel — n'est libérée qu'en dernier. Pour ",[674,2760,2761],{},"factorielle(3)",",\nla pile se déploie ainsi :",[793,2764,2769],{"className":2765,"code":2767,"language":2768},[2766],"language-text","factorielle(3)        ← retour : 3 * factorielle(2)\n  factorielle(2)      ← retour : 2 * factorielle(1)\n    factorielle(1)    ← retour : 1 * factorielle(0)\n      factorielle(0)  ← retour : 1\n","text",[674,2770,2767],{"__ignoreMap":798},[599,2772,2773,2774,2777,2778,614],{},"Puis la pile se ",[603,2775,2776],{},"dépile"," dans l'ordre inverse :\n",[802,2779,2782,2844],{"className":2780},[2781],"katex",[802,2783,2786],{"className":2784},[2785],"katex-mathml",[1698,2787,2789],{"xmlns":2788},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[2790,2791,2792,2839],"semantics",{},[2793,2794,2795,2798,2802,2804,2807,2809,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836],"mrow",{},[2796,2797,897],"mn",{},[2799,2800,2801],"mo",{},"→",[2796,2803,897],{},[2799,2805,2806],{},"×",[2796,2808,897],{},[2799,2810,2811],{},"=",[2796,2813,897],{},[2799,2815,2801],{},[2796,2817,1292],{},[2799,2819,2806],{},[2796,2821,897],{},[2799,2823,2811],{},[2796,2825,1292],{},[2799,2827,2801],{},[2796,2829,1254],{},[2799,2831,2806],{},[2796,2833,1292],{},[2799,2835,2811],{},[2796,2837,2838],{},"6",[2840,2841,2843],"annotation",{"encoding":2842},"application\u002Fx-tex","1 \\to 1 \\times 1 = 1 \\to 2 \\times 1 = 2 \\to 3 \\times 2 = 6",[802,2845,2849,2874,2895,2913,2931,2949,2967,2985,3003,3021],{"className":2846,"ariaHidden":2848},[2847],"katex-html","true",[802,2850,2853,2858,2862,2867,2871],{"className":2851},[2852],"base",[802,2854],{"className":2855,"style":2857},[2856],"strut","height:0.6444em;",[802,2859,897],{"className":2860},[2861],"mord",[802,2863],{"className":2864,"style":2866},[2865],"mspace","margin-right:0.2778em;",[802,2868,2801],{"className":2869},[2870],"mrel",[802,2872],{"className":2873,"style":2866},[2865],[802,2875,2877,2881,2884,2888,2892],{"className":2876},[2852],[802,2878],{"className":2879,"style":2880},[2856],"height:0.7278em;vertical-align:-0.0833em;",[802,2882,897],{"className":2883},[2861],[802,2885],{"className":2886,"style":2887},[2865],"margin-right:0.2222em;",[802,2889,2806],{"className":2890},[2891],"mbin",[802,2893],{"className":2894,"style":2887},[2865],[802,2896,2898,2901,2904,2907,2910],{"className":2897},[2852],[802,2899],{"className":2900,"style":2857},[2856],[802,2902,897],{"className":2903},[2861],[802,2905],{"className":2906,"style":2866},[2865],[802,2908,2811],{"className":2909},[2870],[802,2911],{"className":2912,"style":2866},[2865],[802,2914,2916,2919,2922,2925,2928],{"className":2915},[2852],[802,2917],{"className":2918,"style":2857},[2856],[802,2920,897],{"className":2921},[2861],[802,2923],{"className":2924,"style":2866},[2865],[802,2926,2801],{"className":2927},[2870],[802,2929],{"className":2930,"style":2866},[2865],[802,2932,2934,2937,2940,2943,2946],{"className":2933},[2852],[802,2935],{"className":2936,"style":2880},[2856],[802,2938,1292],{"className":2939},[2861],[802,2941],{"className":2942,"style":2887},[2865],[802,2944,2806],{"className":2945},[2891],[802,2947],{"className":2948,"style":2887},[2865],[802,2950,2952,2955,2958,2961,2964],{"className":2951},[2852],[802,2953],{"className":2954,"style":2857},[2856],[802,2956,897],{"className":2957},[2861],[802,2959],{"className":2960,"style":2866},[2865],[802,2962,2811],{"className":2963},[2870],[802,2965],{"className":2966,"style":2866},[2865],[802,2968,2970,2973,2976,2979,2982],{"className":2969},[2852],[802,2971],{"className":2972,"style":2857},[2856],[802,2974,1292],{"className":2975},[2861],[802,2977],{"className":2978,"style":2866},[2865],[802,2980,2801],{"className":2981},[2870],[802,2983],{"className":2984,"style":2866},[2865],[802,2986,2988,2991,2994,2997,3000],{"className":2987},[2852],[802,2989],{"className":2990,"style":2880},[2856],[802,2992,1254],{"className":2993},[2861],[802,2995],{"className":2996,"style":2887},[2865],[802,2998,2806],{"className":2999},[2891],[802,3001],{"className":3002,"style":2887},[2865],[802,3004,3006,3009,3012,3015,3018],{"className":3005},[2852],[802,3007],{"className":3008,"style":2857},[2856],[802,3010,1292],{"className":3011},[2861],[802,3013],{"className":3014,"style":2866},[2865],[802,3016,2811],{"className":3017},[2870],[802,3019],{"className":3020,"style":2866},[2865],[802,3022,3024,3027],{"className":3023},[2852],[802,3025],{"className":3026,"style":2857},[2856],[802,3028,2838],{"className":3029},[2861],[776,3031,3032],{},[599,3033,3034,3035,3038,3039,3042,3043,3045,3046,3049],{},"Python limite la profondeur de pile à ",[603,3036,3037],{},"1000 appels"," par défaut\n(",[674,3040,3041],{},"sys.getrecursionlimit()","). Au-delà, ",[674,3044,2656],{},". C'est une limite\n",[603,3047,3048],{},"pratique"," de l'implémentation, pas une limite théorique de la récursion.",[895,3051,3053,3058],{"correct":897,"slug":3052},"recursivite-c1",[900,3054,3055],{"v-slot:question":798},[599,3056,3057],{},"Combien d'appels récursifs imbriqués pour factorielle(4) ?",[900,3059,3060],{"v-slot:choices":798},[908,3061,3062,3064,3066],{},[911,3063,1254],{},[911,3065,1301],{},[911,3067,2720],{},[594,3069,3071],{"id":3070},"complexité-la-factorielle-est-linéaire","Complexité — la factorielle est linéaire",[599,3073,3074,3075,3128,3129,3132],{},"Notons ",[802,3076,3078,3102],{"className":3077},[2781],[802,3079,3081],{"className":3080},[2785],[1698,3082,3083],{"xmlns":2788},[2790,3084,3085,3099],{},[2793,3086,3087,3091,3094,3096],{},[3088,3089,3090],"mi",{},"T",[2799,3092,813],{"stretchy":3093},"false",[3088,3095,1410],{},[2799,3097,3098],{"stretchy":3093},")",[2840,3100,3101],{"encoding":2842},"T(n)",[802,3103,3105],{"className":3104,"ariaHidden":2848},[2847],[802,3106,3108,3112,3117,3121,3124],{"className":3107},[2852],[802,3109],{"className":3110,"style":3111},[2856],"height:1em;vertical-align:-0.25em;",[802,3113,3090],{"className":3114,"style":3116},[2861,3115],"mathnormal","margin-right:0.1389em;",[802,3118,813],{"className":3119},[3120],"mopen",[802,3122,1410],{"className":3123},[2861,3115],[802,3125,3098],{"className":3126},[3127],"mclose"," le nombre d'opérations pour calculer ",[674,3130,3131],{},"factorielle(n)",". La\ndéfinition récursive donne directement :",[599,3134,3135],{},[802,3136,3138,3212],{"className":3137},[2781],[802,3139,3141],{"className":3140},[2785],[1698,3142,3143],{"xmlns":2788},[2790,3144,3145,3209],{},[2793,3146,3147,3149,3151,3153,3155,3157,3159,3161,3163,3166,3168,3170,3173,3176,3178,3180,3182,3185,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207],{},[3088,3148,3090],{},[2799,3150,813],{"stretchy":3093},[3088,3152,1410],{},[2799,3154,3098],{"stretchy":3093},[2799,3156,2811],{},[3088,3158,3090],{},[2799,3160,813],{"stretchy":3093},[3088,3162,1410],{},[2799,3164,3165],{},"−",[2796,3167,897],{},[2799,3169,3098],{"stretchy":3093},[2799,3171,3172],{},"+",[3088,3174,3175],{},"O",[2799,3177,813],{"stretchy":3093},[2796,3179,897],{},[2799,3181,3098],{"stretchy":3093},[2865,3183],{"width":3184},"1em",[3186,3187,3188],"mtext",{},"avec",[2865,3190],{"width":3184},[3088,3192,3090],{},[2799,3194,813],{"stretchy":3093},[2796,3196,1352],{},[2799,3198,3098],{"stretchy":3093},[2799,3200,2811],{},[3088,3202,3175],{},[2799,3204,813],{"stretchy":3093},[2796,3206,897],{},[2799,3208,3098],{"stretchy":3093},[2840,3210,3211],{"encoding":2842},"T(n) = T(n-1) + O(1) \\quad \\text{avec} \\quad T(0) = O(1)",[802,3213,3215,3242,3266,3287,3340],{"className":3214,"ariaHidden":2848},[2847],[802,3216,3218,3221,3224,3227,3230,3233,3236,3239],{"className":3217},[2852],[802,3219],{"className":3220,"style":3111},[2856],[802,3222,3090],{"className":3223,"style":3116},[2861,3115],[802,3225,813],{"className":3226},[3120],[802,3228,1410],{"className":3229},[2861,3115],[802,3231,3098],{"className":3232},[3127],[802,3234],{"className":3235,"style":2866},[2865],[802,3237,2811],{"className":3238},[2870],[802,3240],{"className":3241,"style":2866},[2865],[802,3243,3245,3248,3251,3254,3257,3260,3263],{"className":3244},[2852],[802,3246],{"className":3247,"style":3111},[2856],[802,3249,3090],{"className":3250,"style":3116},[2861,3115],[802,3252,813],{"className":3253},[3120],[802,3255,1410],{"className":3256},[2861,3115],[802,3258],{"className":3259,"style":2887},[2865],[802,3261,3165],{"className":3262},[2891],[802,3264],{"className":3265,"style":2887},[2865],[802,3267,3269,3272,3275,3278,3281,3284],{"className":3268},[2852],[802,3270],{"className":3271,"style":3111},[2856],[802,3273,897],{"className":3274},[2861],[802,3276,3098],{"className":3277},[3127],[802,3279],{"className":3280,"style":2887},[2865],[802,3282,3172],{"className":3283},[2891],[802,3285],{"className":3286,"style":2887},[2865],[802,3288,3290,3293,3297,3300,3303,3306,3310,3316,3319,3322,3325,3328,3331,3334,3337],{"className":3289},[2852],[802,3291],{"className":3292,"style":3111},[2856],[802,3294,3175],{"className":3295,"style":3296},[2861,3115],"margin-right:0.0278em;",[802,3298,813],{"className":3299},[3120],[802,3301,897],{"className":3302},[2861],[802,3304,3098],{"className":3305},[3127],[802,3307],{"className":3308,"style":3309},[2865],"margin-right:1em;",[802,3311,3313],{"className":3312},[2861,2768],[802,3314,3188],{"className":3315},[2861],[802,3317],{"className":3318,"style":3309},[2865],[802,3320,3090],{"className":3321,"style":3116},[2861,3115],[802,3323,813],{"className":3324},[3120],[802,3326,1352],{"className":3327},[2861],[802,3329,3098],{"className":3330},[3127],[802,3332],{"className":3333,"style":2866},[2865],[802,3335,2811],{"className":3336},[2870],[802,3338],{"className":3339,"style":2866},[2865],[802,3341,3343,3346,3349,3352,3355],{"className":3342},[2852],[802,3344],{"className":3345,"style":3111},[2856],[802,3347,3175],{"className":3348,"style":3296},[2861,3115],[802,3350,813],{"className":3351},[3120],[802,3353,897],{"className":3354},[2861],[802,3356,3098],{"className":3357},[3127],[599,3359,3360,3361,3663,3664,3745,3746,3749],{},"En déroulant : ",[802,3362,3364,3444],{"className":3363},[2781],[802,3365,3367],{"className":3366},[2785],[1698,3368,3369],{"xmlns":2788},[2790,3370,3371,3441],{},[2793,3372,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391,3393,3395,3397,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420,3422,3425,3427,3429,3431,3433,3435,3437,3439],{},[3088,3374,3090],{},[2799,3376,813],{"stretchy":3093},[3088,3378,1410],{},[2799,3380,3098],{"stretchy":3093},[2799,3382,2811],{},[3088,3384,3090],{},[2799,3386,813],{"stretchy":3093},[3088,3388,1410],{},[2799,3390,3165],{},[2796,3392,897],{},[2799,3394,3098],{"stretchy":3093},[2799,3396,3172],{},[3088,3398,3399],{},"c",[2799,3401,2811],{},[3088,3403,3090],{},[2799,3405,813],{"stretchy":3093},[3088,3407,1410],{},[2799,3409,3165],{},[2796,3411,1292],{},[2799,3413,3098],{"stretchy":3093},[2799,3415,3172],{},[2796,3417,1292],{},[3088,3419,3399],{},[2799,3421,2811],{},[2799,3423,3424],{},"⋯",[2799,3426,2811],{},[3088,3428,3090],{},[2799,3430,813],{"stretchy":3093},[2796,3432,1352],{},[2799,3434,3098],{"stretchy":3093},[2799,3436,3172],{},[3088,3438,1410],{},[3088,3440,3399],{},[2840,3442,3443],{"encoding":2842},"T(n) = T(n-1) + c = T(n-2) + 2c = \\dots = T(0) + nc",[802,3445,3447,3474,3498,3519,3538,3562,3583,3604,3624,3651],{"className":3446,"ariaHidden":2848},[2847],[802,3448,3450,3453,3456,3459,3462,3465,3468,3471],{"className":3449},[2852],[802,3451],{"className":3452,"style":3111},[2856],[802,3454,3090],{"className":3455,"style":3116},[2861,3115],[802,3457,813],{"className":3458},[3120],[802,3460,1410],{"className":3461},[2861,3115],[802,3463,3098],{"className":3464},[3127],[802,3466],{"className":3467,"style":2866},[2865],[802,3469,2811],{"className":3470},[2870],[802,3472],{"className":3473,"style":2866},[2865],[802,3475,3477,3480,3483,3486,3489,3492,3495],{"className":3476},[2852],[802,3478],{"className":3479,"style":3111},[2856],[802,3481,3090],{"className":3482,"style":3116},[2861,3115],[802,3484,813],{"className":3485},[3120],[802,3487,1410],{"className":3488},[2861,3115],[802,3490],{"className":3491,"style":2887},[2865],[802,3493,3165],{"className":3494},[2891],[802,3496],{"className":3497,"style":2887},[2865],[802,3499,3501,3504,3507,3510,3513,3516],{"className":3500},[2852],[802,3502],{"className":3503,"style":3111},[2856],[802,3505,897],{"className":3506},[2861],[802,3508,3098],{"className":3509},[3127],[802,3511],{"className":3512,"style":2887},[2865],[802,3514,3172],{"className":3515},[2891],[802,3517],{"className":3518,"style":2887},[2865],[802,3520,3522,3526,3529,3532,3535],{"className":3521},[2852],[802,3523],{"className":3524,"style":3525},[2856],"height:0.4306em;",[802,3527,3399],{"className":3528},[2861,3115],[802,3530],{"className":3531,"style":2866},[2865],[802,3533,2811],{"className":3534},[2870],[802,3536],{"className":3537,"style":2866},[2865],[802,3539,3541,3544,3547,3550,3553,3556,3559],{"className":3540},[2852],[802,3542],{"className":3543,"style":3111},[2856],[802,3545,3090],{"className":3546,"style":3116},[2861,3115],[802,3548,813],{"className":3549},[3120],[802,3551,1410],{"className":3552},[2861,3115],[802,3554],{"className":3555,"style":2887},[2865],[802,3557,3165],{"className":3558},[2891],[802,3560],{"className":3561,"style":2887},[2865],[802,3563,3565,3568,3571,3574,3577,3580],{"className":3564},[2852],[802,3566],{"className":3567,"style":3111},[2856],[802,3569,1292],{"className":3570},[2861],[802,3572,3098],{"className":3573},[3127],[802,3575],{"className":3576,"style":2887},[2865],[802,3578,3172],{"className":3579},[2891],[802,3581],{"className":3582,"style":2887},[2865],[802,3584,3586,3589,3592,3595,3598,3601],{"className":3585},[2852],[802,3587],{"className":3588,"style":2857},[2856],[802,3590,1292],{"className":3591},[2861],[802,3593,3399],{"className":3594},[2861,3115],[802,3596],{"className":3597,"style":2866},[2865],[802,3599,2811],{"className":3600},[2870],[802,3602],{"className":3603,"style":2866},[2865],[802,3605,3607,3611,3615,3618,3621],{"className":3606},[2852],[802,3608],{"className":3609,"style":3610},[2856],"height:0.3669em;",[802,3612,3424],{"className":3613},[3614],"minner",[802,3616],{"className":3617,"style":2866},[2865],[802,3619,2811],{"className":3620},[2870],[802,3622],{"className":3623,"style":2866},[2865],[802,3625,3627,3630,3633,3636,3639,3642,3645,3648],{"className":3626},[2852],[802,3628],{"className":3629,"style":3111},[2856],[802,3631,3090],{"className":3632,"style":3116},[2861,3115],[802,3634,813],{"className":3635},[3120],[802,3637,1352],{"className":3638},[2861],[802,3640,3098],{"className":3641},[3127],[802,3643],{"className":3644,"style":2887},[2865],[802,3646,3172],{"className":3647},[2891],[802,3649],{"className":3650,"style":2887},[2865],[802,3652,3654,3657,3660],{"className":3653},[2852],[802,3655],{"className":3656,"style":3525},[2856],[802,3658,1410],{"className":3659},[2861,3115],[802,3661,3399],{"className":3662},[2861,3115],", soit\n",[802,3665,3667,3697],{"className":3666},[2781],[802,3668,3670],{"className":3669},[2785],[1698,3671,3672],{"xmlns":2788},[2790,3673,3674,3694],{},[2793,3675,3676,3678,3680,3682,3684,3686,3688,3690,3692],{},[3088,3677,3090],{},[2799,3679,813],{"stretchy":3093},[3088,3681,1410],{},[2799,3683,3098],{"stretchy":3093},[2799,3685,2811],{},[3088,3687,3175],{},[2799,3689,813],{"stretchy":3093},[3088,3691,1410],{},[2799,3693,3098],{"stretchy":3093},[2840,3695,3696],{"encoding":2842},"T(n) = O(n)",[802,3698,3700,3727],{"className":3699,"ariaHidden":2848},[2847],[802,3701,3703,3706,3709,3712,3715,3718,3721,3724],{"className":3702},[2852],[802,3704],{"className":3705,"style":3111},[2856],[802,3707,3090],{"className":3708,"style":3116},[2861,3115],[802,3710,813],{"className":3711},[3120],[802,3713,1410],{"className":3714},[2861,3115],[802,3716,3098],{"className":3717},[3127],[802,3719],{"className":3720,"style":2866},[2865],[802,3722,2811],{"className":3723},[2870],[802,3725],{"className":3726,"style":2866},[2865],[802,3728,3730,3733,3736,3739,3742],{"className":3729},[2852],[802,3731],{"className":3732,"style":3111},[2856],[802,3734,3175],{"className":3735,"style":3296},[2861,3115],[802,3737,813],{"className":3738},[3120],[802,3740,1410],{"className":3741},[2861,3115],[802,3743,3098],{"className":3744},[3127],". La factorielle récursive est ",[603,3747,3748],{},"linéaire"," — exactement comme\nsa version itérative.",[594,3751,3753],{"id":3752},"fibonacci-naïf-lexplosion-exponentielle","Fibonacci naïf — l'explosion exponentielle",[599,3755,3756,3757,677,3868,677,3960,614],{},"Considérons Fibonacci : ",[802,3758,3760,3784],{"className":3759},[2781],[802,3761,3763],{"className":3762},[2785],[1698,3764,3765],{"xmlns":2788},[2790,3766,3767,3781],{},[2793,3768,3769,3777,3779],{},[3770,3771,3772,3775],"msub",{},[3088,3773,3774],{},"F",[2796,3776,1352],{},[2799,3778,2811],{},[2796,3780,1352],{},[2840,3782,3783],{"encoding":2842},"F_0 = 0",[802,3785,3787,3859],{"className":3786,"ariaHidden":2848},[2847],[802,3788,3790,3794,3850,3853,3856],{"className":3789},[2852],[802,3791],{"className":3792,"style":3793},[2856],"height:0.8333em;vertical-align:-0.15em;",[802,3795,3797,3800],{"className":3796},[2861],[802,3798,3774],{"className":3799,"style":3116},[2861,3115],[802,3801,3804],{"className":3802},[3803],"msupsub",[802,3805,3809,3841],{"className":3806},[3807,3808],"vlist-t","vlist-t2",[802,3810,3813,3836],{"className":3811},[3812],"vlist-r",[802,3814,3818],{"className":3815,"style":3817},[3816],"vlist","height:0.3011em;",[802,3819,3821,3826],{"style":3820},"top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;",[802,3822],{"className":3823,"style":3825},[3824],"pstrut","height:2.7em;",[802,3827,3833],{"className":3828},[3829,3830,3831,3832],"sizing","reset-size6","size3","mtight",[802,3834,1352],{"className":3835},[2861,3832],[802,3837,3840],{"className":3838},[3839],"vlist-s","​",[802,3842,3844],{"className":3843},[3812],[802,3845,3848],{"className":3846,"style":3847},[3816],"height:0.15em;",[802,3849],{},[802,3851],{"className":3852,"style":2866},[2865],[802,3854,2811],{"className":3855},[2870],[802,3857],{"className":3858,"style":2866},[2865],[802,3860,3862,3865],{"className":3861},[2852],[802,3863],{"className":3864,"style":2857},[2856],[802,3866,1352],{"className":3867},[2861],[802,3869,3871,3893],{"className":3870},[2781],[802,3872,3874],{"className":3873},[2785],[1698,3875,3876],{"xmlns":2788},[2790,3877,3878,3890],{},[2793,3879,3880,3886,3888],{},[3770,3881,3882,3884],{},[3088,3883,3774],{},[2796,3885,897],{},[2799,3887,2811],{},[2796,3889,897],{},[2840,3891,3892],{"encoding":2842},"F_1 = 1",[802,3894,3896,3951],{"className":3895,"ariaHidden":2848},[2847],[802,3897,3899,3902,3942,3945,3948],{"className":3898},[2852],[802,3900],{"className":3901,"style":3793},[2856],[802,3903,3905,3908],{"className":3904},[2861],[802,3906,3774],{"className":3907,"style":3116},[2861,3115],[802,3909,3911],{"className":3910},[3803],[802,3912,3914,3934],{"className":3913},[3807,3808],[802,3915,3917,3931],{"className":3916},[3812],[802,3918,3920],{"className":3919,"style":3817},[3816],[802,3921,3922,3925],{"style":3820},[802,3923],{"className":3924,"style":3825},[3824],[802,3926,3928],{"className":3927},[3829,3830,3831,3832],[802,3929,897],{"className":3930},[2861,3832],[802,3932,3840],{"className":3933},[3839],[802,3935,3937],{"className":3936},[3812],[802,3938,3940],{"className":3939,"style":3847},[3816],[802,3941],{},[802,3943],{"className":3944,"style":2866},[2865],[802,3946,2811],{"className":3947},[2870],[802,3949],{"className":3950,"style":2866},[2865],[802,3952,3954,3957],{"className":3953},[2852],[802,3955],{"className":3956,"style":2857},[2856],[802,3958,897],{"className":3959},[2861],[802,3961,3963,4009],{"className":3962},[2781],[802,3964,3966],{"className":3965},[2785],[1698,3967,3968],{"xmlns":2788},[2790,3969,3970,4006],{},[2793,3971,3972,3978,3980,3992,3994],{},[3770,3973,3974,3976],{},[3088,3975,3774],{},[3088,3977,1410],{},[2799,3979,2811],{},[3770,3981,3982,3984],{},[3088,3983,3774],{},[2793,3985,3986,3988,3990],{},[3088,3987,1410],{},[2799,3989,3165],{},[2796,3991,897],{},[2799,3993,3172],{},[3770,3995,3996,3998],{},[3088,3997,3774],{},[2793,3999,4000,4002,4004],{},[3088,4001,1410],{},[2799,4003,3165],{},[2796,4005,1292],{},[2840,4007,4008],{"encoding":2842},"F_n = F_{n-1} + F_{n-2}",[802,4010,4012,4068,4134],{"className":4011,"ariaHidden":2848},[2847],[802,4013,4015,4018,4059,4062,4065],{"className":4014},[2852],[802,4016],{"className":4017,"style":3793},[2856],[802,4019,4021,4024],{"className":4020},[2861],[802,4022,3774],{"className":4023,"style":3116},[2861,3115],[802,4025,4027],{"className":4026},[3803],[802,4028,4030,4051],{"className":4029},[3807,3808],[802,4031,4033,4048],{"className":4032},[3812],[802,4034,4037],{"className":4035,"style":4036},[3816],"height:0.1514em;",[802,4038,4039,4042],{"style":3820},[802,4040],{"className":4041,"style":3825},[3824],[802,4043,4045],{"className":4044},[3829,3830,3831,3832],[802,4046,1410],{"className":4047},[2861,3115,3832],[802,4049,3840],{"className":4050},[3839],[802,4052,4054],{"className":4053},[3812],[802,4055,4057],{"className":4056,"style":3847},[3816],[802,4058],{},[802,4060],{"className":4061,"style":2866},[2865],[802,4063,2811],{"className":4064},[2870],[802,4066],{"className":4067,"style":2866},[2865],[802,4069,4071,4075,4125,4128,4131],{"className":4070},[2852],[802,4072],{"className":4073,"style":4074},[2856],"height:0.8917em;vertical-align:-0.2083em;",[802,4076,4078,4081],{"className":4077},[2861],[802,4079,3774],{"className":4080,"style":3116},[2861,3115],[802,4082,4084],{"className":4083},[3803],[802,4085,4087,4116],{"className":4086},[3807,3808],[802,4088,4090,4113],{"className":4089},[3812],[802,4091,4093],{"className":4092,"style":3817},[3816],[802,4094,4095,4098],{"style":3820},[802,4096],{"className":4097,"style":3825},[3824],[802,4099,4101],{"className":4100},[3829,3830,3831,3832],[802,4102,4104,4107,4110],{"className":4103},[2861,3832],[802,4105,1410],{"className":4106},[2861,3115,3832],[802,4108,3165],{"className":4109},[2891,3832],[802,4111,897],{"className":4112},[2861,3832],[802,4114,3840],{"className":4115},[3839],[802,4117,4119],{"className":4118},[3812],[802,4120,4123],{"className":4121,"style":4122},[3816],"height:0.2083em;",[802,4124],{},[802,4126],{"className":4127,"style":2887},[2865],[802,4129,3172],{"className":4130},[2891],[802,4132],{"className":4133,"style":2887},[2865],[802,4135,4137,4140],{"className":4136},[2852],[802,4138],{"className":4139,"style":4074},[2856],[802,4141,4143,4146],{"className":4142},[2861],[802,4144,3774],{"className":4145,"style":3116},[2861,3115],[802,4147,4149],{"className":4148},[3803],[802,4150,4152,4181],{"className":4151},[3807,3808],[802,4153,4155,4178],{"className":4154},[3812],[802,4156,4158],{"className":4157,"style":3817},[3816],[802,4159,4160,4163],{"style":3820},[802,4161],{"className":4162,"style":3825},[3824],[802,4164,4166],{"className":4165},[3829,3830,3831,3832],[802,4167,4169,4172,4175],{"className":4168},[2861,3832],[802,4170,1410],{"className":4171},[2861,3115,3832],[802,4173,3165],{"className":4174},[2891,3832],[802,4176,1292],{"className":4177},[2861,3832],[802,4179,3840],{"className":4180},[3839],[802,4182,4184],{"className":4183},[3812],[802,4185,4187],{"className":4186,"style":4122},[3816],[802,4188],{},[793,4190,4192],{"className":795,"code":4191,"language":797,"meta":798,"style":798},"def fib_naif(n: int) -> int:\n    \"\"\"Fibonacci, version récursive directe.\"\"\"\n    assert n >= 0\n    if n \u003C 2:\n        return n\n    return fib_naif(n - 1) + fib_naif(n - 2)\n",[674,4193,4194,4211,4216,4227,4239,4245],{"__ignoreMap":798},[802,4195,4196,4198,4201,4203,4205,4207,4209],{"class":804,"line":805},[802,4197,943],{"class":819},[802,4199,4200],{"class":946}," fib_naif",[802,4202,1105],{"class":812},[802,4204,676],{"class":808},[802,4206,960],{"class":812},[802,4208,676],{"class":808},[802,4210,965],{"class":812},[802,4212,4213],{"class":804,"line":833},[802,4214,4215],{"class":970},"    \"\"\"Fibonacci, version récursive directe.\"\"\"\n",[802,4217,4218,4220,4222,4224],{"class":804,"line":858},[802,4219,976],{"class":819},[802,4221,2578],{"class":812},[802,4223,2052],{"class":819},[802,4225,4226],{"class":808}," 0\n",[802,4228,4229,4231,4233,4235,4237],{"class":804,"line":993},[802,4230,2592],{"class":819},[802,4232,2578],{"class":812},[802,4234,884],{"class":819},[802,4236,1178],{"class":808},[802,4238,965],{"class":812},[802,4240,4241,4243],{"class":804,"line":1010},[802,4242,2609],{"class":819},[802,4244,1184],{"class":812},[802,4246,4247,4249,4252,4254,4256,4258,4260,4262,4264,4266],{"class":804,"line":1029},[802,4248,1032],{"class":819},[802,4250,4251],{"class":812}," fib_naif(n ",[802,4253,1284],{"class":819},[802,4255,2628],{"class":808},[802,4257,881],{"class":812},[802,4259,3172],{"class":819},[802,4261,4251],{"class":812},[802,4263,1284],{"class":819},[802,4265,1178],{"class":808},[802,4267,1355],{"class":812},[599,4269,4270,4271,4274],{},"Chaque appel en déclenche ",[603,4272,4273],{},"deux",". La relation de récurrence devient :",[599,4276,4277],{},[802,4278,4280,4338],{"className":4279},[2781],[802,4281,4283],{"className":4282},[2785],[1698,4284,4285],{"xmlns":2788},[2790,4286,4287,4335],{},[2793,4288,4289,4291,4293,4295,4297,4299,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333],{},[3088,4290,3090],{},[2799,4292,813],{"stretchy":3093},[3088,4294,1410],{},[2799,4296,3098],{"stretchy":3093},[2799,4298,2811],{},[3088,4300,3090],{},[2799,4302,813],{"stretchy":3093},[3088,4304,1410],{},[2799,4306,3165],{},[2796,4308,897],{},[2799,4310,3098],{"stretchy":3093},[2799,4312,3172],{},[3088,4314,3090],{},[2799,4316,813],{"stretchy":3093},[3088,4318,1410],{},[2799,4320,3165],{},[2796,4322,1292],{},[2799,4324,3098],{"stretchy":3093},[2799,4326,3172],{},[3088,4328,3175],{},[2799,4330,813],{"stretchy":3093},[2796,4332,897],{},[2799,4334,3098],{"stretchy":3093},[2840,4336,4337],{"encoding":2842},"T(n) = T(n-1) + T(n-2) + O(1)",[802,4339,4341,4368,4392,4413,4437,4458],{"className":4340,"ariaHidden":2848},[2847],[802,4342,4344,4347,4350,4353,4356,4359,4362,4365],{"className":4343},[2852],[802,4345],{"className":4346,"style":3111},[2856],[802,4348,3090],{"className":4349,"style":3116},[2861,3115],[802,4351,813],{"className":4352},[3120],[802,4354,1410],{"className":4355},[2861,3115],[802,4357,3098],{"className":4358},[3127],[802,4360],{"className":4361,"style":2866},[2865],[802,4363,2811],{"className":4364},[2870],[802,4366],{"className":4367,"style":2866},[2865],[802,4369,4371,4374,4377,4380,4383,4386,4389],{"className":4370},[2852],[802,4372],{"className":4373,"style":3111},[2856],[802,4375,3090],{"className":4376,"style":3116},[2861,3115],[802,4378,813],{"className":4379},[3120],[802,4381,1410],{"className":4382},[2861,3115],[802,4384],{"className":4385,"style":2887},[2865],[802,4387,3165],{"className":4388},[2891],[802,4390],{"className":4391,"style":2887},[2865],[802,4393,4395,4398,4401,4404,4407,4410],{"className":4394},[2852],[802,4396],{"className":4397,"style":3111},[2856],[802,4399,897],{"className":4400},[2861],[802,4402,3098],{"className":4403},[3127],[802,4405],{"className":4406,"style":2887},[2865],[802,4408,3172],{"className":4409},[2891],[802,4411],{"className":4412,"style":2887},[2865],[802,4414,4416,4419,4422,4425,4428,4431,4434],{"className":4415},[2852],[802,4417],{"className":4418,"style":3111},[2856],[802,4420,3090],{"className":4421,"style":3116},[2861,3115],[802,4423,813],{"className":4424},[3120],[802,4426,1410],{"className":4427},[2861,3115],[802,4429],{"className":4430,"style":2887},[2865],[802,4432,3165],{"className":4433},[2891],[802,4435],{"className":4436,"style":2887},[2865],[802,4438,4440,4443,4446,4449,4452,4455],{"className":4439},[2852],[802,4441],{"className":4442,"style":3111},[2856],[802,4444,1292],{"className":4445},[2861],[802,4447,3098],{"className":4448},[3127],[802,4450],{"className":4451,"style":2887},[2865],[802,4453,3172],{"className":4454},[2891],[802,4456],{"className":4457,"style":2887},[2865],[802,4459,4461,4464,4467,4470,4473],{"className":4460},[2852],[802,4462],{"className":4463,"style":3111},[2856],[802,4465,3175],{"className":4466,"style":3296},[2861,3115],[802,4468,813],{"className":4469},[3120],[802,4471,897],{"className":4472},[2861],[802,4474,3098],{"className":4475},[3127],[599,4477,4478,4479,4594,4595,4840,4841,4844,4845,4848,4849,4852],{},"On montre que ",[802,4480,4482,4518],{"className":4481},[2781],[802,4483,4485],{"className":4484},[2785],[1698,4486,4487],{"xmlns":2788},[2790,4488,4489,4515],{},[2793,4490,4491,4493,4495,4497,4499,4501,4503,4505,4513],{},[3088,4492,3090],{},[2799,4494,813],{"stretchy":3093},[3088,4496,1410],{},[2799,4498,3098],{"stretchy":3093},[2799,4500,2811],{},[3088,4502,3175],{},[2799,4504,813],{"stretchy":3093},[4506,4507,4508,4511],"msup",{},[3088,4509,4510],{},"φ",[3088,4512,1410],{},[2799,4514,3098],{"stretchy":3093},[2840,4516,4517],{"encoding":2842},"T(n) = O(\\varphi^n)",[802,4519,4521,4548],{"className":4520,"ariaHidden":2848},[2847],[802,4522,4524,4527,4530,4533,4536,4539,4542,4545],{"className":4523},[2852],[802,4525],{"className":4526,"style":3111},[2856],[802,4528,3090],{"className":4529,"style":3116},[2861,3115],[802,4531,813],{"className":4532},[3120],[802,4534,1410],{"className":4535},[2861,3115],[802,4537,3098],{"className":4538},[3127],[802,4540],{"className":4541,"style":2866},[2865],[802,4543,2811],{"className":4544},[2870],[802,4546],{"className":4547,"style":2866},[2865],[802,4549,4551,4554,4557,4560,4591],{"className":4550},[2852],[802,4552],{"className":4553,"style":3111},[2856],[802,4555,3175],{"className":4556,"style":3296},[2861,3115],[802,4558,813],{"className":4559},[3120],[802,4561,4563,4566],{"className":4562},[2861],[802,4564,4510],{"className":4565},[2861,3115],[802,4567,4569],{"className":4568},[3803],[802,4570,4572],{"className":4571},[3807],[802,4573,4575],{"className":4574},[3812],[802,4576,4579],{"className":4577,"style":4578},[3816],"height:0.6644em;",[802,4580,4582,4585],{"style":4581},"top:-3.063em;margin-right:0.05em;",[802,4583],{"className":4584,"style":3825},[3824],[802,4586,4588],{"className":4587},[3829,3830,3831,3832],[802,4589,1410],{"className":4590},[2861,3115,3832],[802,4592,3098],{"className":4593},[3127]," avec ",[802,4596,4598,4636],{"className":4597},[2781],[802,4599,4601],{"className":4600},[2785],[1698,4602,4603],{"xmlns":2788},[2790,4604,4605,4633],{},[2793,4606,4607,4609,4611,4627,4630],{},[3088,4608,4510],{},[2799,4610,2811],{},[4612,4613,4614,4625],"mfrac",{},[2793,4615,4616,4618,4620],{},[2796,4617,897],{},[2799,4619,3172],{},[4621,4622,4623],"msqrt",{},[2796,4624,2720],{},[2796,4626,1292],{},[2799,4628,4629],{},"≈",[2796,4631,4632],{},"1,618",[2840,4634,4635],{"encoding":2842},"\\varphi = \\frac{1 + \\sqrt{5}}{2}\n\\approx 1{,}618",[802,4637,4639,4658,4818],{"className":4638,"ariaHidden":2848},[2847],[802,4640,4642,4646,4649,4652,4655],{"className":4641},[2852],[802,4643],{"className":4644,"style":4645},[2856],"height:0.625em;vertical-align:-0.1944em;",[802,4647,4510],{"className":4648},[2861,3115],[802,4650],{"className":4651,"style":2866},[2865],[802,4653,2811],{"className":4654},[2870],[802,4656],{"className":4657,"style":2866},[2865],[802,4659,4661,4665,4809,4812,4815],{"className":4660},[2852],[802,4662],{"className":4663,"style":4664},[2856],"height:1.383em;vertical-align:-0.345em;",[802,4666,4668,4672,4806],{"className":4667},[2861],[802,4669],{"className":4670},[3120,4671],"nulldelimiter",[802,4673,4675],{"className":4674},[4612],[802,4676,4678,4797],{"className":4677},[3807,3808],[802,4679,4681,4794],{"className":4680},[3812],[802,4682,4685,4701,4712],{"className":4683,"style":4684},[3816],"height:1.038em;",[802,4686,4688,4692],{"style":4687},"top:-2.655em;",[802,4689],{"className":4690,"style":4691},[3824],"height:3em;",[802,4693,4695],{"className":4694},[3829,3830,3831,3832],[802,4696,4698],{"className":4697},[2861,3832],[802,4699,1292],{"className":4700},[2861,3832],[802,4702,4704,4707],{"style":4703},"top:-3.23em;",[802,4705],{"className":4706,"style":4691},[3824],[802,4708],{"className":4709,"style":4711},[4710],"frac-line","border-bottom-width:0.04em;",[802,4713,4715,4718],{"style":4714},"top:-3.399em;",[802,4716],{"className":4717,"style":4691},[3824],[802,4719,4721],{"className":4720},[3829,3830,3831,3832],[802,4722,4724,4727,4730],{"className":4723},[2861,3832],[802,4725,897],{"className":4726},[2861,3832],[802,4728,3172],{"className":4729},[2891,3832],[802,4731,4734],{"className":4732},[2861,4733,3832],"sqrt",[802,4735,4737,4785],{"className":4736},[3807,3808],[802,4738,4740,4782],{"className":4739},[3812],[802,4741,4744,4759],{"className":4742,"style":4743},[3816],"height:0.9128em;",[802,4745,4749,4752],{"className":4746,"style":4748},[4747],"svg-align","top:-3em;",[802,4750],{"className":4751,"style":4691},[3824],[802,4753,4756],{"className":4754,"style":4755},[2861,3832],"padding-left:0.833em;",[802,4757,2720],{"className":4758},[2861,3832],[802,4760,4762,4765],{"style":4761},"top:-2.8728em;",[802,4763],{"className":4764,"style":4691},[3824],[802,4766,4770],{"className":4767,"style":4769},[4768,3832],"hide-tail","min-width:0.853em;height:1.08em;",[4771,4772,4778],"svg",{"xmlns":4773,"width":4774,"height":4775,"viewBox":4776,"preserveAspectRatio":4777},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","400em","1.08em","0 0 400000 1080","xMinYMin slice",[4779,4780],"path",{"d":4781},"M95,702\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl0 -0\nc5.3,-9.3,12,-14,20,-14\nH400000v40H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM834 80h400000v40h-400000z",[802,4783,3840],{"className":4784},[3839],[802,4786,4788],{"className":4787},[3812],[802,4789,4792],{"className":4790,"style":4791},[3816],"height:0.1272em;",[802,4793],{},[802,4795,3840],{"className":4796},[3839],[802,4798,4800],{"className":4799},[3812],[802,4801,4804],{"className":4802,"style":4803},[3816],"height:0.345em;",[802,4805],{},[802,4807],{"className":4808},[3127,4671],[802,4810],{"className":4811,"style":2866},[2865],[802,4813,4629],{"className":4814},[2870],[802,4816],{"className":4817,"style":2866},[2865],[802,4819,4821,4825,4828,4836],{"className":4820},[2852],[802,4822],{"className":4823,"style":4824},[2856],"height:0.8389em;vertical-align:-0.1944em;",[802,4826,897],{"className":4827},[2861],[802,4829,4831],{"className":4830},[2861],[802,4832,4835],{"className":4833},[4834],"mpunct",",",[802,4837,4839],{"className":4838},[2861],"618"," — autrement dit, ",[603,4842,4843],{},"exponentielle",". En pratique, ",[674,4846,4847],{},"fib_naif(40)","\nprend déjà plusieurs secondes ; ",[674,4850,4851],{},"fib_naif(60)"," est inatteignable.",[599,4854,4855,4856,4858,4859,4862,4863,4866,4867,4870],{},"La raison : ",[674,4857,4847],{}," recalcule ",[674,4860,4861],{},"fib_naif(38)"," deux fois,\n",[674,4864,4865],{},"fib_naif(37)"," trois fois, ",[674,4868,4869],{},"fib_naif(36)"," cinq fois… exponentiellement.",[594,4872,4874,4875,4949,4950],{"id":4873},"mémoïsation-de-o2no2no2n-à-ononon","Mémoïsation — de ",[802,4876,4878,4902],{"className":4877},[2781],[802,4879,4881],{"className":4880},[2785],[1698,4882,4883],{"xmlns":2788},[2790,4884,4885,4899],{},[2793,4886,4887,4889,4891,4897],{},[3088,4888,3175],{},[2799,4890,813],{"stretchy":3093},[4506,4892,4893,4895],{},[2796,4894,1292],{},[3088,4896,1410],{},[2799,4898,3098],{"stretchy":3093},[2840,4900,4901],{"encoding":2842},"O(2^n)",[802,4903,4905],{"className":4904,"ariaHidden":2848},[2847],[802,4906,4908,4911,4914,4917,4946],{"className":4907},[2852],[802,4909],{"className":4910,"style":3111},[2856],[802,4912,3175],{"className":4913,"style":3296},[2861,3115],[802,4915,813],{"className":4916},[3120],[802,4918,4920,4923],{"className":4919},[2861],[802,4921,1292],{"className":4922},[2861],[802,4924,4926],{"className":4925},[3803],[802,4927,4929],{"className":4928},[3807],[802,4930,4932],{"className":4931},[3812],[802,4933,4935],{"className":4934,"style":4578},[3816],[802,4936,4937,4940],{"style":4581},[802,4938],{"className":4939,"style":3825},[3824],[802,4941,4943],{"className":4942},[3829,3830,3831,3832],[802,4944,1410],{"className":4945},[2861,3115,3832],[802,4947,3098],{"className":4948},[3127]," à ",[802,4951,4953,4973],{"className":4952},[2781],[802,4954,4956],{"className":4955},[2785],[1698,4957,4958],{"xmlns":2788},[2790,4959,4960,4970],{},[2793,4961,4962,4964,4966,4968],{},[3088,4963,3175],{},[2799,4965,813],{"stretchy":3093},[3088,4967,1410],{},[2799,4969,3098],{"stretchy":3093},[2840,4971,4972],{"encoding":2842},"O(n)",[802,4974,4976],{"className":4975,"ariaHidden":2848},[2847],[802,4977,4979,4982,4985,4988,4991],{"className":4978},[2852],[802,4980],{"className":4981,"style":3111},[2856],[802,4983,3175],{"className":4984,"style":3296},[2861,3115],[802,4986,813],{"className":4987},[3120],[802,4989,1410],{"className":4990},[2861,3115],[802,4992,3098],{"className":4993},[3127],[599,4995,1691,4996,4999,5000,5003,5004,614],{},[603,4997,4998],{},"mémoïsation"," mémorise chaque résultat déjà calculé. Une valeur n'est\ncalculée qu'",[603,5001,5002],{},"une fois"," ; les appels suivants sont ",[802,5005,5007,5027],{"className":5006},[2781],[802,5008,5010],{"className":5009},[2785],[1698,5011,5012],{"xmlns":2788},[2790,5013,5014,5024],{},[2793,5015,5016,5018,5020,5022],{},[3088,5017,3175],{},[2799,5019,813],{"stretchy":3093},[2796,5021,897],{},[2799,5023,3098],{"stretchy":3093},[2840,5025,5026],{"encoding":2842},"O(1)",[802,5028,5030],{"className":5029,"ariaHidden":2848},[2847],[802,5031,5033,5036,5039,5042,5045],{"className":5032},[2852],[802,5034],{"className":5035,"style":3111},[2856],[802,5037,3175],{"className":5038,"style":3296},[2861,3115],[802,5040,813],{"className":5041},[3120],[802,5043,897],{"className":5044},[2861],[802,5046,3098],{"className":5047},[3127],[793,5049,5051],{"className":795,"code":5050,"language":797,"meta":798,"style":798},"def fib_memo(n: int, cache: dict = None) -> int:\n    \"\"\"Fibonacci mémoïsé via un dictionnaire.\"\"\"\n    if cache is None:\n        cache = {}\n    if n in cache:\n        return cache[n]\n    if n \u003C 2:\n        return n\n    cache[n] = fib_memo(n - 1, cache) + fib_memo(n - 2, cache)\n    return cache[n]\n",[674,5052,5053,5082,5087,5101,5111,5122,5129,5141,5147,5175],{"__ignoreMap":798},[802,5054,5055,5057,5060,5062,5064,5067,5070,5073,5076,5078,5080],{"class":804,"line":805},[802,5056,943],{"class":819},[802,5058,5059],{"class":946}," fib_memo",[802,5061,1105],{"class":812},[802,5063,676],{"class":808},[802,5065,5066],{"class":812},", cache: ",[802,5068,5069],{"class":808},"dict",[802,5071,5072],{"class":819}," =",[802,5074,5075],{"class":808}," None",[802,5077,960],{"class":812},[802,5079,676],{"class":808},[802,5081,965],{"class":812},[802,5083,5084],{"class":804,"line":833},[802,5085,5086],{"class":970},"    \"\"\"Fibonacci mémoïsé via un dictionnaire.\"\"\"\n",[802,5088,5089,5091,5094,5097,5099],{"class":804,"line":858},[802,5090,2592],{"class":819},[802,5092,5093],{"class":812}," cache ",[802,5095,5096],{"class":819},"is",[802,5098,5075],{"class":808},[802,5100,965],{"class":812},[802,5102,5103,5106,5108],{"class":804,"line":993},[802,5104,5105],{"class":812},"        cache ",[802,5107,2811],{"class":819},[802,5109,5110],{"class":812}," {}\n",[802,5112,5113,5115,5117,5119],{"class":804,"line":1010},[802,5114,2592],{"class":819},[802,5116,2578],{"class":812},[802,5118,1891],{"class":819},[802,5120,5121],{"class":812}," cache:\n",[802,5123,5124,5126],{"class":804,"line":1029},[802,5125,2609],{"class":819},[802,5127,5128],{"class":812}," cache[n]\n",[802,5130,5131,5133,5135,5137,5139],{"class":804,"line":1147},[802,5132,2592],{"class":819},[802,5134,2578],{"class":812},[802,5136,884],{"class":819},[802,5138,1178],{"class":808},[802,5140,965],{"class":812},[802,5142,5143,5145],{"class":804,"line":1153},[802,5144,2609],{"class":819},[802,5146,1184],{"class":812},[802,5148,5149,5152,5154,5157,5159,5161,5164,5166,5168,5170,5172],{"class":804,"line":1161},[802,5150,5151],{"class":812},"    cache[n] ",[802,5153,2811],{"class":819},[802,5155,5156],{"class":812}," fib_memo(n ",[802,5158,1284],{"class":819},[802,5160,2628],{"class":808},[802,5162,5163],{"class":812},", cache) ",[802,5165,3172],{"class":819},[802,5167,5156],{"class":812},[802,5169,1284],{"class":819},[802,5171,1178],{"class":808},[802,5173,5174],{"class":812},", cache)\n",[802,5176,5177,5179],{"class":804,"line":1167},[802,5178,1032],{"class":819},[802,5180,5128],{"class":812},[599,5182,5183],{},"Plus idiomatique en Python : utiliser le décorateur de la bibliothèque\nstandard.",[793,5185,5187],{"className":795,"code":5186,"language":797,"meta":798,"style":798},"from functools import lru_cache\n\n@lru_cache(maxsize=None)\ndef fib(n: int) -> int:\n    if n \u003C 2:\n        return n\n    return fib(n - 1) + fib(n - 2)\n",[674,5188,5189,5201,5205,5223,5240,5252,5258],{"__ignoreMap":798},[802,5190,5191,5193,5196,5198],{"class":804,"line":805},[802,5192,1216],{"class":819},[802,5194,5195],{"class":812}," functools ",[802,5197,1222],{"class":819},[802,5199,5200],{"class":812}," lru_cache\n",[802,5202,5203],{"class":804,"line":833},[802,5204,1124],{"emptyLinePlaceholder":1123},[802,5206,5207,5210,5212,5216,5218,5221],{"class":804,"line":858},[802,5208,5209],{"class":946},"@lru_cache",[802,5211,813],{"class":812},[802,5213,5215],{"class":5214},"sP4rz","maxsize",[802,5217,2811],{"class":819},[802,5219,5220],{"class":808},"None",[802,5222,1355],{"class":812},[802,5224,5225,5227,5230,5232,5234,5236,5238],{"class":804,"line":993},[802,5226,943],{"class":819},[802,5228,5229],{"class":946}," fib",[802,5231,1105],{"class":812},[802,5233,676],{"class":808},[802,5235,960],{"class":812},[802,5237,676],{"class":808},[802,5239,965],{"class":812},[802,5241,5242,5244,5246,5248,5250],{"class":804,"line":1010},[802,5243,2592],{"class":819},[802,5245,2578],{"class":812},[802,5247,884],{"class":819},[802,5249,1178],{"class":808},[802,5251,965],{"class":812},[802,5253,5254,5256],{"class":804,"line":1029},[802,5255,2609],{"class":819},[802,5257,1184],{"class":812},[802,5259,5260,5262,5265,5267,5269,5271,5273,5275,5277,5279],{"class":804,"line":1147},[802,5261,1032],{"class":819},[802,5263,5264],{"class":812}," fib(n ",[802,5266,1284],{"class":819},[802,5268,2628],{"class":808},[802,5270,881],{"class":812},[802,5272,3172],{"class":819},[802,5274,5264],{"class":812},[802,5276,1284],{"class":819},[802,5278,1178],{"class":808},[802,5280,1355],{"class":812},[599,5282,5283,5284,4949,5286,5288],{},"Nouveau coût : chaque valeur de ",[674,5285,1352],{},[674,5287,1410],{}," est calculée une fois.",[599,5290,5291],{},[802,5292,5294,5323],{"className":5293},[2781],[802,5295,5297],{"className":5296},[2785],[1698,5298,5299],{"xmlns":2788},[2790,5300,5301,5321],{},[2793,5302,5303,5305,5307,5309,5311,5313,5315,5317,5319],{},[3088,5304,3090],{},[2799,5306,813],{"stretchy":3093},[3088,5308,1410],{},[2799,5310,3098],{"stretchy":3093},[2799,5312,2811],{},[3088,5314,3175],{},[2799,5316,813],{"stretchy":3093},[3088,5318,1410],{},[2799,5320,3098],{"stretchy":3093},[2840,5322,3696],{"encoding":2842},[802,5324,5326,5353],{"className":5325,"ariaHidden":2848},[2847],[802,5327,5329,5332,5335,5338,5341,5344,5347,5350],{"className":5328},[2852],[802,5330],{"className":5331,"style":3111},[2856],[802,5333,3090],{"className":5334,"style":3116},[2861,3115],[802,5336,813],{"className":5337},[3120],[802,5339,1410],{"className":5340},[2861,3115],[802,5342,3098],{"className":5343},[3127],[802,5345],{"className":5346,"style":2866},[2865],[802,5348,2811],{"className":5349},[2870],[802,5351],{"className":5352,"style":2866},[2865],[802,5354,5356,5359,5362,5365,5368],{"className":5355},[2852],[802,5357],{"className":5358,"style":3111},[2856],[802,5360,3175],{"className":5361,"style":3296},[2861,3115],[802,5363,813],{"className":5364},[3120],[802,5366,1410],{"className":5367},[2861,3115],[802,5369,3098],{"className":5370},[3127],[599,5372,5373,5374,5377,5378,5381],{},"Concrètement, ",[674,5375,5376],{},"fib(100)"," est instantané — alors que ",[674,5379,5380],{},"fib_naif(100)"," ne\nterminerait jamais.",[1066,5383,5384],{},[599,5385,5386,5389,5390,5393],{},[603,5387,5388],{},"Règle générale"," : dès qu'une récursion recalcule plusieurs fois la même\nsous-instance, mémoïser. C'est l'idée centrale de la ",[603,5391,5392],{},"programmation\ndynamique",", formalisée au chapitre TE.",[895,5395,5397,5402],{"correct":1352,"slug":5396},"recursivite-c2",[900,5398,5399],{"v-slot:question":798},[599,5400,5401],{},"Pourquoi fib_naif(n) est-il en O(φ^n) ?",[900,5403,5404],{"v-slot:choices":798},[908,5405,5406,5409,5412],{},[911,5407,5408],{},"Chaque appel en déclenche deux qui ne se réduisent que de 1 ou 2",[911,5410,5411],{},"Python est lent en récursion",[911,5413,5414],{},"Le cache est désactivé",[594,5416,1488],{"id":1487},[599,5418,5419,5420,5423,5424,5427],{},"La récursivité éclaire les structures arborescentes (chapitre TA) — la\nhauteur d'un arbre se calcule récursivement par\n",[674,5421,5422],{},"1 + max(hauteur(gauche), hauteur(droite))",". Certains langages\n(Haskell, OCaml) optimisent la ",[603,5425,5426],{},"récursion terminale"," en boucle — Python\nne le fait pas.",[612,5429],{"code":2438},[1513,5431,5432],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":798,"searchDepth":833,"depth":833,"links":5434},[5435,5436,5437,5438,5439,5440,5442],{"id":596,"depth":833,"text":597},{"id":2480,"depth":833,"text":2481},{"id":2742,"depth":833,"text":2743},{"id":3070,"depth":833,"text":3071},{"id":3752,"depth":833,"text":3753},{"id":4873,"depth":833,"text":5441},"Mémoïsation — de O(2n)O(2^n)O(2n) à O(n)O(n)O(n)",{"id":1487,"depth":833,"text":1488},"Écrire et analyser un programme récursif — pile d'appels, terminaison, factorielle linéaire et Fibonacci naïf vs mémoïsé.",{},[5446,5448],{"slug":3052,"kind":1535,"question":3057,"choices":5447,"correct":897,"multi":1537,"explanation":798},[1254,1301,2720],{"slug":5396,"kind":1535,"question":5401,"choices":5449,"correct":1352,"multi":1537,"explanation":798},[5408,5411,5414],{"title":549,"description":5443},"svW80dTXse1MaQHCk0YQek4hQt0s4pS3aKWkqxmkOy0",{"id":5453,"title":553,"bo":5454,"body":5456,"description":6290,"eval":1530,"extension":1531,"labo":1530,"meta":6291,"navigation":1123,"path":554,"quizzes":6292,"readingTime":805,"seo":6298,"stem":555,"tp":1530,"__hash__":6299},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes.md",[5455],"TD04",{"type":591,"value":5457,"toc":6279},[5458,5460,5473,5491,5526,5530,5598,5612,5616,5619,5623,5626,5730,5752,5756,5763,5893,5909,5949,5953,5960,6116,6139,6157,6161,6217,6231,6254,6256,6274,6276],[594,5459,597],{"id":596},[599,5461,5462,5463,5466,5467,5470,5471,614],{},"Un ",[603,5464,5465],{},"paradigme"," de programmation est une ",[603,5468,5469],{},"manière de concevoir un programme",".\nCe n'est pas un langage : un même langage (comme Python) permet d'écrire en\nplusieurs paradigmes — souvent dans le même fichier. C'est l'objet de l'item\n",[612,5472],{"code":5455},[599,5474,5475,5476,5479,5480,1565,5483,5486,5487,5490],{},"Trois paradigmes structurent l'enseignement de la Terminale : ",[603,5477,5478],{},"impératif",",\n",[603,5481,5482],{},"fonctionnel",[603,5484,5485],{},"orienté objet",". Connaître les trois ne vous transformera\npas en philosophe du code — mais cela vous donnera, devant un problème,\n",[603,5488,5489],{},"plusieurs angles d'attaque",", et la capacité de lire des bases de code\nécrites par d'autres dans leur style natif.",[599,5492,5493,5494,5496,5497,5500,5501,5503,5504,5507,5508,5511,5512,5515,5516,677,5519,677,5522,5525],{},"Une analogie culinaire éclaire la distinction. L'",[603,5495,5478],{}," ressemble à\nune ",[603,5498,5499],{},"recette de cuisine"," : « prendre une casserole, verser l'eau, allumer le\nfeu, attendre, ajouter le sel… » — une suite d'instructions sur un état qui\névolue. Le ",[603,5502,5482],{}," ressemble à la ",[603,5505,5506],{},"description du plat fini"," : « un\nrisotto = un riz arrondi, lié au bouillon, parfumé au safran » — une\ncomposition, pas une marche à suivre. L'",[603,5509,5510],{},"objet"," ressemble à un ",[603,5513,5514],{},"cuisinier","\nqui dispose de méthodes (",[674,5517,5518],{},"saler",[674,5520,5521],{},"goûter",[674,5523,5524],{},"flamber",") et qui maintient en\nmémoire l'état de sa préparation.",[594,5527,5529],{"id":5528},"trois-paradigmes-en-une-phrase","Trois paradigmes en une phrase",[641,5531,5532,5545],{},[644,5533,5534],{},[647,5535,5536,5539,5542],{},[650,5537,5538],{},"Paradigme",[650,5540,5541],{},"Idée centrale",[650,5543,5544],{},"Élément de base",[660,5546,5547,5564,5581],{},[647,5548,5549,5554,5561],{},[665,5550,5551],{},[603,5552,5553],{},"Impératif",[665,5555,5556,5557,5560],{},"Décrire une ",[603,5558,5559],{},"suite d'instructions"," qui modifient un état.",[665,5562,5563],{},"Variable, affectation, boucle.",[647,5565,5566,5571,5578],{},[665,5567,5568],{},[603,5569,5570],{},"Fonctionnel",[665,5572,5573,5574,5577],{},"Composer des ",[603,5575,5576],{},"fonctions pures"," qui transforment des données.",[665,5579,5580],{},"Fonction, application, composition.",[647,5582,5583,5588,5595],{},[665,5584,5585],{},[603,5586,5587],{},"Orienté objet",[665,5589,5590,5591,5594],{},"Modéliser des ",[603,5592,5593],{},"objets"," qui portent état et comportement.",[665,5596,5597],{},"Classe, instance, méthode.",[1687,5599,5600],{},[599,5601,5602,5603,5605,5606,5608,5609,5611],{},"Aucun paradigme n'est universellement supérieur. Chacun éclaire mieux certains\nproblèmes : le ",[603,5604,5482],{}," brille sur les transformations de données, l'\n",[603,5607,5478],{}," sur les boucles sur structures mutables, l'",[603,5610,5510],{}," sur la\nmodélisation de systèmes avec état persistant.",[594,5613,5615],{"id":5614},"le-même-problème-trois-fois-la-somme-dune-liste","Le même problème, trois fois — la somme d'une liste",[599,5617,5618],{},"Prenons une tâche élémentaire : calculer la somme d'une liste d'entiers.",[1087,5620,5622],{"id":5621},"style-impératif","Style impératif",[599,5624,5625],{},"On parcourt la liste, on accumule dans une variable.",[793,5627,5629],{"className":795,"code":5628,"language":797,"meta":798,"style":798},"def somme_imperative(liste):\n    \"\"\"Somme par accumulation dans une variable mutable.\"\"\"\n    total = 0                      # état initial\n    for x in liste:                # boucle\n        total = total + x          # mise à jour de l'état\n    return total\n\nprint(somme_imperative([1, 2, 3, 4]))   # 10\n",[674,5630,5631,5641,5646,5658,5674,5692,5699,5703],{"__ignoreMap":798},[802,5632,5633,5635,5638],{"class":804,"line":805},[802,5634,943],{"class":819},[802,5636,5637],{"class":946}," somme_imperative",[802,5639,5640],{"class":812},"(liste):\n",[802,5642,5643],{"class":804,"line":833},[802,5644,5645],{"class":970},"    \"\"\"Somme par accumulation dans une variable mutable.\"\"\"\n",[802,5647,5648,5651,5653,5655],{"class":804,"line":858},[802,5649,5650],{"class":812},"    total ",[802,5652,2811],{"class":819},[802,5654,1021],{"class":808},[802,5656,5657],{"class":829},"                      # état initial\n",[802,5659,5660,5663,5666,5668,5671],{"class":804,"line":993},[802,5661,5662],{"class":819},"    for",[802,5664,5665],{"class":812}," x ",[802,5667,1891],{"class":819},[802,5669,5670],{"class":812}," liste:                ",[802,5672,5673],{"class":829},"# boucle\n",[802,5675,5676,5679,5681,5684,5686,5689],{"class":804,"line":1010},[802,5677,5678],{"class":812},"        total ",[802,5680,2811],{"class":819},[802,5682,5683],{"class":812}," total ",[802,5685,3172],{"class":819},[802,5687,5688],{"class":812}," x          ",[802,5690,5691],{"class":829},"# mise à jour de l'état\n",[802,5693,5694,5696],{"class":804,"line":1029},[802,5695,1032],{"class":819},[802,5697,5698],{"class":812}," total\n",[802,5700,5701],{"class":804,"line":1147},[802,5702,1124],{"emptyLinePlaceholder":1123},[802,5704,5705,5707,5710,5712,5714,5716,5718,5720,5722,5724,5727],{"class":804,"line":1153},[802,5706,809],{"class":808},[802,5708,5709],{"class":812},"(somme_imperative([",[802,5711,897],{"class":808},[802,5713,677],{"class":812},[802,5715,1292],{"class":808},[802,5717,677],{"class":812},[802,5719,1254],{"class":808},[802,5721,677],{"class":812},[802,5723,1301],{"class":808},[802,5725,5726],{"class":812},"]))   ",[802,5728,5729],{"class":829},"# 10\n",[599,5731,5732,5735,5736,5739,5740,5743,5744,5747,5748,5751],{},[603,5733,5734],{},"Clés"," : variable ",[674,5737,5738],{},"total"," qui ",[603,5741,5742],{},"mute",", boucle ",[674,5745,5746],{},"for"," explicite, séquence\nd'instructions qui décrivent ",[603,5749,5750],{},"comment"," calculer.",[1087,5753,5755],{"id":5754},"style-fonctionnel","Style fonctionnel",[599,5757,5758,5759,5762],{},"On exprime la somme comme l'",[603,5760,5761],{},"application"," d'une opération de réduction\nsur la liste.",[793,5764,5766],{"className":795,"code":5765,"language":797,"meta":798,"style":798},"from functools import reduce\nfrom operator import add\n\ndef somme_fonctionnelle(liste):\n    \"\"\"Somme par réduction — pas de variable mutable.\"\"\"\n    return reduce(add, liste, 0)\n\nprint(somme_fonctionnelle([1, 2, 3, 4]))   # 10\n\n# Variante encore plus directe :\nprint(sum([1, 2, 3, 4]))                   # 10 — sum est une fonction native\n",[674,5767,5768,5779,5791,5795,5804,5809,5823,5827,5852,5856,5861],{"__ignoreMap":798},[802,5769,5770,5772,5774,5776],{"class":804,"line":805},[802,5771,1216],{"class":819},[802,5773,5195],{"class":812},[802,5775,1222],{"class":819},[802,5777,5778],{"class":5214}," reduce\n",[802,5780,5781,5783,5786,5788],{"class":804,"line":833},[802,5782,1216],{"class":819},[802,5784,5785],{"class":812}," operator ",[802,5787,1222],{"class":819},[802,5789,5790],{"class":812}," add\n",[802,5792,5793],{"class":804,"line":858},[802,5794,1124],{"emptyLinePlaceholder":1123},[802,5796,5797,5799,5802],{"class":804,"line":993},[802,5798,943],{"class":819},[802,5800,5801],{"class":946}," somme_fonctionnelle",[802,5803,5640],{"class":812},[802,5805,5806],{"class":804,"line":1010},[802,5807,5808],{"class":970},"    \"\"\"Somme par réduction — pas de variable mutable.\"\"\"\n",[802,5810,5811,5813,5816,5819,5821],{"class":804,"line":1029},[802,5812,1032],{"class":819},[802,5814,5815],{"class":5214}," reduce",[802,5817,5818],{"class":812},"(add, liste, ",[802,5820,1352],{"class":808},[802,5822,1355],{"class":812},[802,5824,5825],{"class":804,"line":1147},[802,5826,1124],{"emptyLinePlaceholder":1123},[802,5828,5829,5831,5834,5836,5838,5840,5842,5844,5846,5848,5850],{"class":804,"line":1153},[802,5830,809],{"class":808},[802,5832,5833],{"class":812},"(somme_fonctionnelle([",[802,5835,897],{"class":808},[802,5837,677],{"class":812},[802,5839,1292],{"class":808},[802,5841,677],{"class":812},[802,5843,1254],{"class":808},[802,5845,677],{"class":812},[802,5847,1301],{"class":808},[802,5849,5726],{"class":812},[802,5851,5729],{"class":829},[802,5853,5854],{"class":804,"line":1161},[802,5855,1124],{"emptyLinePlaceholder":1123},[802,5857,5858],{"class":804,"line":1167},[802,5859,5860],{"class":829},"# Variante encore plus directe :\n",[802,5862,5863,5865,5867,5870,5873,5875,5877,5879,5881,5883,5885,5887,5890],{"class":804,"line":1173},[802,5864,809],{"class":808},[802,5866,813],{"class":812},[802,5868,5869],{"class":808},"sum",[802,5871,5872],{"class":812},"([",[802,5874,897],{"class":808},[802,5876,677],{"class":812},[802,5878,1292],{"class":808},[802,5880,677],{"class":812},[802,5882,1254],{"class":808},[802,5884,677],{"class":812},[802,5886,1301],{"class":808},[802,5888,5889],{"class":812},"]))                   ",[802,5891,5892],{"class":829},"# 10 — sum est une fonction native\n",[599,5894,5895,5897,5898,5901,5902,5904,5905,5908],{},[603,5896,5734],{}," : aucune affectation, aucune boucle visible, on ",[603,5899,5900],{},"décrit"," le résultat\ncomme la réduction de la liste par l'addition à partir de ",[674,5903,1352],{},". La fonction est\n",[603,5906,5907],{},"pure"," : pas d'effet de bord, le même argument donne toujours le même\nrésultat.",[1066,5910,5911,5914],{},[599,5912,5913],{},"Trois primitives fonctionnelles à retenir :",[908,5915,5916,5928,5938],{},[911,5917,5918,5923,5924,5927],{},[603,5919,5920],{},[674,5921,5922],{},"map(f, l)"," : applique ",[674,5925,5926],{},"f"," à chaque élément.",[911,5929,5930,5935,5936,614],{},[603,5931,5932],{},[674,5933,5934],{},"filter(p, l)"," : garde les éléments qui vérifient le prédicat ",[674,5937,599],{},[911,5939,5940,5945,5946,614],{},[603,5941,5942],{},[674,5943,5944],{},"reduce(op, l, init)"," : combine tous les éléments par ",[674,5947,5948],{},"op",[1087,5950,5952],{"id":5951},"style-orienté-objet","Style orienté objet",[599,5954,5955,5956,5959],{},"On modélise un ",[603,5957,5958],{},"objet somme"," qui porte un état (le total courant) et\nexpose des méthodes pour le faire évoluer.",[793,5961,5963],{"className":795,"code":5962,"language":797,"meta":798,"style":798},"class Somme:\n    \"\"\"Objet qui accumule une somme par ajouts successifs.\"\"\"\n\n    def __init__(self):\n        self._total = 0\n\n    def ajouter(self, x):\n        self._total += x\n\n    def valeur(self):\n        return self._total\n\n\ns = Somme()\nfor x in [1, 2, 3, 4]:\n    s.ajouter(x)\nprint(s.valeur())              # 10\n",[674,5964,5965,5975,5980,5984,5995,6007,6011,6021,6033,6037,6046,6056,6060,6064,6074,6102,6107],{"__ignoreMap":798},[802,5966,5967,5970,5973],{"class":804,"line":805},[802,5968,5969],{"class":819},"class",[802,5971,5972],{"class":946}," Somme",[802,5974,965],{"class":812},[802,5976,5977],{"class":804,"line":833},[802,5978,5979],{"class":970},"    \"\"\"Objet qui accumule une somme par ajouts successifs.\"\"\"\n",[802,5981,5982],{"class":804,"line":858},[802,5983,1124],{"emptyLinePlaceholder":1123},[802,5985,5986,5989,5992],{"class":804,"line":993},[802,5987,5988],{"class":819},"    def",[802,5990,5991],{"class":808}," __init__",[802,5993,5994],{"class":812},"(self):\n",[802,5996,5997,6000,6003,6005],{"class":804,"line":1010},[802,5998,5999],{"class":808},"        self",[802,6001,6002],{"class":812},"._total ",[802,6004,2811],{"class":819},[802,6006,4226],{"class":808},[802,6008,6009],{"class":804,"line":1029},[802,6010,1124],{"emptyLinePlaceholder":1123},[802,6012,6013,6015,6018],{"class":804,"line":1147},[802,6014,5988],{"class":819},[802,6016,6017],{"class":946}," ajouter",[802,6019,6020],{"class":812},"(self, x):\n",[802,6022,6023,6025,6027,6030],{"class":804,"line":1153},[802,6024,5999],{"class":808},[802,6026,6002],{"class":812},[802,6028,6029],{"class":819},"+=",[802,6031,6032],{"class":812}," x\n",[802,6034,6035],{"class":804,"line":1161},[802,6036,1124],{"emptyLinePlaceholder":1123},[802,6038,6039,6041,6044],{"class":804,"line":1167},[802,6040,5988],{"class":819},[802,6042,6043],{"class":946}," valeur",[802,6045,5994],{"class":812},[802,6047,6048,6050,6053],{"class":804,"line":1173},[802,6049,2609],{"class":819},[802,6051,6052],{"class":808}," self",[802,6054,6055],{"class":812},"._total\n",[802,6057,6058],{"class":804,"line":1328},[802,6059,1124],{"emptyLinePlaceholder":1123},[802,6061,6062],{"class":804,"line":1342},[802,6063,1124],{"emptyLinePlaceholder":1123},[802,6065,6066,6069,6071],{"class":804,"line":2025},[802,6067,6068],{"class":812},"s ",[802,6070,2811],{"class":819},[802,6072,6073],{"class":812}," Somme()\n",[802,6075,6076,6078,6080,6082,6085,6087,6089,6091,6093,6095,6097,6099],{"class":804,"line":2033},[802,6077,5746],{"class":819},[802,6079,5665],{"class":812},[802,6081,1891],{"class":819},[802,6083,6084],{"class":812}," [",[802,6086,897],{"class":808},[802,6088,677],{"class":812},[802,6090,1292],{"class":808},[802,6092,677],{"class":812},[802,6094,1254],{"class":808},[802,6096,677],{"class":812},[802,6098,1301],{"class":808},[802,6100,6101],{"class":812},"]:\n",[802,6103,6104],{"class":804,"line":2039},[802,6105,6106],{"class":812},"    s.ajouter(x)\n",[802,6108,6109,6111,6114],{"class":804,"line":2044},[802,6110,809],{"class":808},[802,6112,6113],{"class":812},"(s.valeur())              ",[802,6115,5729],{"class":829},[599,6117,6118,6120,6121,6124,6125,6128,6129,677,6132,6135,6136,6138],{},[603,6119,5734],{}," : la classe ",[674,6122,6123],{},"Somme"," encapsule l'état (",[674,6126,6127],{},"self._total",") et expose un\ncontrat (",[674,6130,6131],{},"ajouter",[674,6133,6134],{},"valeur","). L'utilisateur ne manipule plus une variable\nlocale, mais un ",[603,6137,5510],{}," qu'on instancie et avec lequel on dialogue.",[895,6140,6142,6147],{"correct":897,"slug":6141},"paradigmes-c1",[900,6143,6144],{"v-slot:question":798},[599,6145,6146],{},"Quel paradigme n'utilise pas de variable mutable ?",[900,6148,6149],{"v-slot:choices":798},[908,6150,6151,6153,6155],{},[911,6152,5553],{},[911,6154,5570],{},[911,6156,5587],{},[594,6158,6160],{"id":6159},"comment-choisir","Comment choisir ?",[641,6162,6163,6173],{},[644,6164,6165],{},[647,6166,6167,6170],{},[650,6168,6169],{},"Type de problème",[650,6171,6172],{},"Paradigme privilégié",[660,6174,6175,6193,6201,6209],{},[647,6176,6177,6180],{},[665,6178,6179],{},"Pipeline de transformation de données (CSV, JSON…).",[665,6181,6182,6183,1906,6186,1906,6189,6192],{},"Fonctionnel (",[674,6184,6185],{},"map",[674,6187,6188],{},"filter",[674,6190,6191],{},"reduce",").",[647,6194,6195,6198],{},[665,6196,6197],{},"Algorithme sur un tableau, simulation pas à pas.",[665,6199,6200],{},"Impératif.",[647,6202,6203,6206],{},[665,6204,6205],{},"Modélisation d'un domaine métier (jeu, banque, plateforme).",[665,6207,6208],{},"Orienté objet.",[647,6210,6211,6214],{},[665,6212,6213],{},"Interface graphique, machine à état.",[665,6215,6216],{},"Objet, souvent.",[1687,6218,6219],{},[599,6220,6221,6222,6225,6226,1906,6228,6230],{},"En pratique, on ",[603,6223,6224],{},"mixe"," : un programme Python typique utilise des classes\n(objet) qui contiennent des boucles (impératif) et appellent ",[674,6227,6185],{},[674,6229,6188],{},"\n(fonctionnel). Le pragmatisme prime sur la pureté.",[895,6232,6234,6241],{"correct":897,"slug":6233},"paradigmes-c2",[900,6235,6236],{"v-slot:question":798},[599,6237,2445,6238,6240],{},[674,6239,5907],{}," est une fonction qui…",[900,6242,6243],{"v-slot:choices":798},[908,6244,6245,6248,6251],{},[911,6246,6247],{},"utilise seulement des entiers",[911,6249,6250],{},"n a pas d effet de bord et donne le même résultat pour les mêmes arguments",[911,6252,6253],{},"est définie dans une classe",[594,6255,1488],{"id":1487},[599,6257,6258,6259,6262,6263,6266,6267,6270,6271,6273],{},"D'autres paradigmes existent : ",[603,6260,6261],{},"logique"," (Prolog), ",[603,6264,6265],{},"concurrent"," (acteurs,\nErlang), ",[603,6268,6269],{},"réactif"," (flux d'événements). Le programme officiel limite\nl'étude aux trois principaux. Mais retenez l'idée : un langage n'est qu'un\nvéhicule ; le ",[603,6272,1513],{}," que vous y adoptez dépend du paradigme — et de votre\nmaturité de concepteur.",[612,6275],{"code":5455},[1513,6277,6278],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":798,"searchDepth":833,"depth":833,"links":6280},[6281,6282,6283,6288,6289],{"id":596,"depth":833,"text":597},{"id":5528,"depth":833,"text":5529},{"id":5614,"depth":833,"text":5615,"children":6284},[6285,6286,6287],{"id":5621,"depth":858,"text":5622},{"id":5754,"depth":858,"text":5755},{"id":5951,"depth":858,"text":5952},{"id":6159,"depth":833,"text":6160},{"id":1487,"depth":833,"text":1488},"Distinguer impératif, fonctionnel et objet — un même problème (la somme d'une liste) résolu dans les trois styles.",{},[6293,6295],{"slug":6141,"kind":1535,"question":6146,"choices":6294,"correct":897,"multi":1537,"explanation":798},[5553,5570,5587],{"slug":6233,"kind":1535,"question":6296,"choices":6297,"correct":897,"multi":1537,"explanation":798},"Une fonction pure est une fonction qui…",[6247,6250,6253],{"title":553,"description":6290},"hvrdR3tjvk6gSeOvU2gixeaTX2mHXoSORew_wv5cSNs",{"id":6301,"title":557,"bo":6302,"body":6304,"description":6938,"eval":1530,"extension":1531,"labo":1530,"meta":6939,"navigation":1123,"path":558,"quizzes":6940,"readingTime":805,"seo":6945,"stem":559,"tp":1530,"__hash__":6946},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee.md",[6303],"TD03",{"type":591,"value":6305,"toc":6929},[6306,6308,6321,6337,6341,6364,6419,6435,6474,6478,6489,6503,6512,6521,6542,6546,6549,6582,6592,6596,6603,6618,6621,6683,6698,6706,6713,6770,6786,6842,6863,6867,6877,6891,6912,6914,6924,6926],[594,6307,597],{"id":596},[599,6309,6310,6311,6314,6315,6318,6319,614],{},"Vous avez écrit du code toute l'année. Il est temps de ",[603,6312,6313],{},"regarder le code\nlui-même comme une donnée"," : un texte qu'un autre programme peut lire,\nanalyser, exécuter, transformer. Cette idée — anodine en apparence — fonde\ntoute l'informatique théorique, et débouche sur l'un de ses résultats les plus\nprofonds : ",[603,6316,6317],{},"certains problèmes parfaitement définis n'admettent aucun\nprogramme qui les résout",". C'est le contenu de l'item ",[612,6320],{"code":6303},[599,6322,6323,6324,6327,6328,6331,6332,6336],{},"Le cœur de ce que vous allez voir est un cousin algorithmique du ",[603,6325,6326],{},"paradoxe\ndu menteur"," (« cette phrase est fausse » : si elle est vraie, elle est\nfausse ; si elle est fausse, elle est vraie). L'auteur de la démonstration,\n",[603,6329,6330],{},"Alan Turing",", est aussi celui dont le film ",[6333,6334,6335],"em",{},"The Imitation Game"," (2014)\nretrace la contribution au déchiffrement d'Enigma pendant la Seconde Guerre\nmondiale — mais ses idées sur le calcul, formulées dès 1936, lui survivent\nencore plus largement.",[594,6338,6340],{"id":6339},"un-programme-est-une-donnée","Un programme est une donnée",[599,6342,6343,6344,6347,6348,6351,6352,6355,6356,6359,6360,6363],{},"Quand vous tapez ",[674,6345,6346],{},"python mon_script.py",", voici ce qui se passe : le programme\n",[603,6349,6350],{},"CPython"," (l'interpréteur Python, lui-même écrit en C) lit votre fichier\n",[674,6353,6354],{},"mon_script.py",", le ",[603,6357,6358],{},"parse"," en une structure de données interne (un arbre\nsyntaxique), puis l'",[603,6361,6362],{},"exécute",". Votre script n'est pas magique — c'est une\nchaîne de caractères, lue comme telle par un autre programme.",[641,6365,6366,6378],{},[644,6367,6368],{},[647,6369,6370,6373,6376],{},[650,6371,6372],{},"Outil",[650,6374,6375],{},"Rôle",[650,6377,658],{},[660,6379,6380,6393,6406],{},[647,6381,6382,6387,6390],{},[665,6383,6384],{},[603,6385,6386],{},"Interpréteur",[665,6388,6389],{},"Lit le code et l'exécute directement.",[665,6391,6392],{},"CPython, navigateur (JS).",[647,6394,6395,6400,6403],{},[665,6396,6397],{},[603,6398,6399],{},"Compilateur",[665,6401,6402],{},"Traduit le code en un autre langage (souvent du natif).",[665,6404,6405],{},"GCC pour le C, javac pour Java.",[647,6407,6408,6413,6416],{},[665,6409,6410],{},[603,6411,6412],{},"Transpileur",[665,6414,6415],{},"Traduit d'un langage source vers un autre langage source.",[665,6417,6418],{},"TypeScript → JavaScript.",[1687,6420,6421],{},[599,6422,6423,6424,6427,6428,6430,6431,6434],{},"CPython est lui-même un programme — écrit en C, ",[603,6425,6426],{},"compilé"," par GCC en un\nexécutable natif. Quand vous lancez Python, vous lancez un exécutable qui lit\nvotre ",[674,6429,1626],{}," comme un humain lirait un livre. Le code que vous écrivez est la\n",[603,6432,6433],{},"donnée d'entrée"," de CPython.",[790,6436,6437],{},[793,6438,6440],{"className":795,"code":6439,"language":797,"meta":798,"style":798},"# Un programme peut manipuler du code Python comme une chaîne :\ncode_source = \"x = 2 + 3\\nprint(x)\"\nexec(code_source)        # affiche 5 — Python exécute son propre code\n",[674,6441,6442,6447,6463],{"__ignoreMap":798},[802,6443,6444],{"class":804,"line":805},[802,6445,6446],{"class":829},"# Un programme peut manipuler du code Python comme une chaîne :\n",[802,6448,6449,6452,6454,6457,6460],{"class":804,"line":833},[802,6450,6451],{"class":812},"code_source ",[802,6453,2811],{"class":819},[802,6455,6456],{"class":970}," \"x = 2 + 3",[802,6458,6459],{"class":808},"\\n",[802,6461,6462],{"class":970},"print(x)\"\n",[802,6464,6465,6468,6471],{"class":804,"line":858},[802,6466,6467],{"class":808},"exec",[802,6469,6470],{"class":812},"(code_source)        ",[802,6472,6473],{"class":829},"# affiche 5 — Python exécute son propre code\n",[594,6475,6477],{"id":6476},"calculabilité-ce-qui-peut-être-calculé","Calculabilité — ce qui peut être calculé",[599,6479,6480,6481,6484,6485,6488],{},"Une fonction est dite ",[603,6482,6483],{},"calculable"," s'il existe un ",[603,6486,6487],{},"algorithme"," (donc un\nprogramme, dans n'importe quel langage Turing-complet) qui la calcule en un\nnombre fini d'étapes pour toute entrée.",[599,6490,6491,6494,6495,6498,6499,6502],{},[603,6492,6493],{},"Thèse de Church-Turing (énoncé informel)"," : la classe des fonctions\ncalculables est ",[603,6496,6497],{},"la même"," pour tous les modèles de calcul raisonnables —\nmachine de Turing, λ-calcul, Python, C, JavaScript. Le choix du langage ne\nchange pas ",[603,6500,6501],{},"ce qui est calculable",", seulement la commodité d'écriture.",[1687,6504,6505],{},[599,6506,6507,6508,6511],{},"On parle bien d'une ",[603,6509,6510],{},"thèse"," et non d'un théorème : la notion intuitive de\n« fonction calculable » n'est pas un objet mathématique, on ne peut donc pas\ndémontrer formellement l'équivalence. Mais tous les modèles de calcul proposés\ndepuis 1936 se sont avérés équivalents — la thèse a force d'évidence\nexpérimentale.",[776,6513,6514],{},[599,6515,6516,6517,6520],{},"Il est tentant de croire qu'un langage plus puissant calcule plus de choses.\n",[603,6518,6519],{},"C'est faux",". Python ne sait pas calculer plus que ce qu'une machine de\nTuring peut calculer — il l'écrit juste plus vite.",[895,6522,6524,6529],{"correct":897,"slug":6523},"programme-comme-donnee-c1",[900,6525,6526],{"v-slot:question":798},[599,6527,6528],{},"Calculabilité dépend-elle du langage utilisé ?",[900,6530,6531],{"v-slot:choices":798},[908,6532,6533,6536,6539],{},[911,6534,6535],{},"Oui — un langage puissant calcule plus de fonctions",[911,6537,6538],{},"Non — tous les langages Turing-complets calculent les mêmes fonctions",[911,6540,6541],{},"Cela dépend du compilateur",[594,6543,6545],{"id":6544},"le-problème-de-larrêt-lénoncé","Le problème de l'arrêt — l'énoncé",[599,6547,6548],{},"Voici une question simple en apparence :",[6550,6551,6552],"blockquote",{},[599,6553,6554,6555,6558,6559,6561,6562,677,6565,6568,6569,6571,6572,6574,6575,6577,6578,6581],{},"Existe-t-il un programme ",[674,6556,6557],{},"arret(p, e)"," qui, étant donné un programme ",[674,6560,599],{}," et\nune entrée ",[674,6563,6564],{},"e",[603,6566,6567],{},"répond toujours"," par ",[674,6570,1437],{}," si l'exécution de ",[674,6573,599],{}," sur ",[674,6576,6564],{},"\ntermine, et par ",[674,6579,6580],{},"False"," sinon ?",[599,6583,6584,6585,6588,6589,614],{},"Un tel programme serait précieux : il détecterait toutes les boucles infinies\navant exécution. Hélas, ",[603,6586,6587],{},"un tel programme n'existe pas",". Le ",[603,6590,6591],{},"problème de\nl'arrêt est indécidable",[594,6593,6595],{"id":6594},"la-preuve-par-auto-référence","La preuve par auto-référence",[599,6597,6598,6599,6602],{},"L'argument est dû à Alan Turing (1936). Il procède par ",[603,6600,6601],{},"l'absurde"," et\nexploite le fait qu'un programme est une donnée pour un autre programme.",[599,6604,6605,6608,6609,6611,6612,6614,6615,6617],{},[603,6606,6607],{},"Supposons"," qu'une fonction ",[674,6610,6557],{}," existe, qui termine toujours et\nrépond correctement à la question : « le programme ",[674,6613,599],{}," exécuté sur ",[674,6616,6564],{},"\ntermine-t-il ? ».",[599,6619,6620],{},"Construisons alors la fonction suivante :",[793,6622,6624],{"className":795,"code":6623,"language":797,"meta":798,"style":798},"def paradox(p):\n    if arret(p, p):       # si p appliqué à p termine…\n        while True:        # …alors paradox boucle pour toujours.\n            pass\n    else:                  # sinon (p sur p ne termine pas)…\n        return            # …paradox termine immédiatement.\n",[674,6625,6626,6636,6646,6660,6665,6676],{"__ignoreMap":798},[802,6627,6628,6630,6633],{"class":804,"line":805},[802,6629,943],{"class":819},[802,6631,6632],{"class":946}," paradox",[802,6634,6635],{"class":812},"(p):\n",[802,6637,6638,6640,6643],{"class":804,"line":833},[802,6639,2592],{"class":819},[802,6641,6642],{"class":812}," arret(p, p):       ",[802,6644,6645],{"class":829},"# si p appliqué à p termine…\n",[802,6647,6648,6651,6654,6657],{"class":804,"line":858},[802,6649,6650],{"class":819},"        while",[802,6652,6653],{"class":808}," True",[802,6655,6656],{"class":812},":        ",[802,6658,6659],{"class":829},"# …alors paradox boucle pour toujours.\n",[802,6661,6662],{"class":804,"line":993},[802,6663,6664],{"class":819},"            pass\n",[802,6666,6667,6670,6673],{"class":804,"line":1010},[802,6668,6669],{"class":819},"    else",[802,6671,6672],{"class":812},":                  ",[802,6674,6675],{"class":829},"# sinon (p sur p ne termine pas)…\n",[802,6677,6678,6680],{"class":804,"line":1029},[802,6679,2609],{"class":819},[802,6681,6682],{"class":829},"            # …paradox termine immédiatement.\n",[599,6684,6685,6686,6689,6690,6697],{},"Le code de ",[674,6687,6688],{},"paradox"," est un programme Python parfaitement bien défini, ",[603,6691,6692,6693,6696],{},"à\ncondition que ",[674,6694,6695],{},"arret"," existe",". Posons-nous la question fatidique :",[599,6699,6700],{},[603,6701,6702,6703,1380],{},"Que se passe-t-il quand on exécute ",[674,6704,6705],{},"paradox(paradox)",[599,6707,6708,6709,6712],{},"Deux cas possibles, et ",[603,6710,6711],{},"les deux mènent à une contradiction"," :",[1831,6714,6715,6744],{},[911,6716,6717,6723,6724,6726,6727,6730,6731,6733,6734,6736,6737,6739,6740,6743],{},[603,6718,6719,6720,6722],{},"Si ",[674,6721,6705],{}," termine"," : alors par définition de ",[674,6725,6688],{},",\nc'est que ",[674,6728,6729],{},"arret(paradox, paradox)"," a retourné ",[674,6732,6580],{},". Mais ",[674,6735,6695],{}," est\ncensé être correcte — donc ",[674,6738,6705],{}," ne termine ",[603,6741,6742],{},"pas",".\nContradiction.",[911,6745,6746,6751,6752,6754,6755,6730,6757,6759,6760,6762,6763,6765,6766,6769],{},[603,6747,6719,6748,6750],{},[674,6749,6705],{}," ne termine pas"," : alors par définition de\n",[674,6753,6688],{},", c'est que ",[674,6756,6729],{},[674,6758,1437],{},". Mais\n",[674,6761,6695],{}," est censé être correcte — donc ",[674,6764,6705],{}," termine\n",[603,6767,6768],{},"bien",". Contradiction.",[599,6771,6772,6773,6775,6776,6779,6780,614],{},"L'hypothèse de départ (l'existence de ",[674,6774,6695],{},") conduit à une contradiction\ndans ",[603,6777,6778],{},"tous les cas",". Cette hypothèse est donc fausse. ",[603,6781,6782,6783,6785],{},"Aucun programme\n",[674,6784,6695],{}," ne peut exister",[1066,6787,6788],{},[599,6789,6790,6791,6794,6795,6797,6798,6801,6802,6835,6836,1920,6839,614],{},"L'argument exploite la ",[603,6792,6793],{},"diagonalisation"," : on construit un programme qui\ndemande à ",[674,6796,6695],{}," ce qui va lui arriver à lui-même, puis fait ",[603,6799,6800],{},"l'inverse"," —\nexactement le mécanisme du paradoxe du menteur, transposé en code. C'est la\nmême idée que dans la preuve de Cantor sur la non-dénombrabilité de\n",[802,6803,6805,6821],{"className":6804},[2781],[802,6806,6808],{"className":6807},[2785],[1698,6809,6810],{"xmlns":2788},[2790,6811,6812,6818],{},[2793,6813,6814],{},[3088,6815,6817],{"mathvariant":6816},"double-struck","R",[2840,6819,6820],{"encoding":2842},"\\mathbb{R}",[802,6822,6824],{"className":6823,"ariaHidden":2848},[2847],[802,6825,6827,6831],{"className":6826},[2852],[802,6828],{"className":6829,"style":6830},[2856],"height:0.6889em;",[802,6832,6817],{"className":6833},[2861,6834],"mathbb",". Le procédé est appelé ",[603,6837,6838],{},"auto-référence",[603,6840,6841],{},"argument\ndiagonal",[895,6843,6845,6850],{"correct":1352,"slug":6844},"programme-comme-donnee-c2",[900,6846,6847],{"v-slot:question":798},[599,6848,6849],{},"Le problème de l'arrêt est indécidable signifie que…",[900,6851,6852],{"v-slot:choices":798},[908,6853,6854,6857,6860],{},[911,6855,6856],{},"aucun programme ne peut décider correctement pour TOUTE entrée",[911,6858,6859],{},"l ordinateur n est pas assez puissant",[911,6861,6862],{},"il faudrait un langage plus expressif",[594,6864,6866],{"id":6865},"conséquences","Conséquences",[599,6868,6869,6870,6872,6873,6876],{},"L'indécidabilité du problème de l'arrêt n'est ",[603,6871,6742],{}," une limite technique\nqu'on lèvera demain avec un meilleur compilateur. C'est une ",[603,6874,6875],{},"limite\nmathématique",", démontrée, universelle. Elle a des cousines :",[908,6878,6879,6885],{},[911,6880,6881,6884],{},[603,6882,6883],{},"Indécidabilité de l'équivalence"," : on ne peut pas écrire un programme\nqui décide si deux programmes calculent la même fonction.",[911,6886,6887,6890],{},[603,6888,6889],{},"Théorème de Rice (1953)"," : toute propriété non-triviale de la fonction\ncalculée par un programme est indécidable.",[599,6892,6893,6894,6897,6898,5479,6900,6903,6904,6907,6908,6911],{},"Cela dit, ",[603,6895,6896],{},"les outils approchés existent"," : analyseurs statiques (",[674,6899,1501],{},[674,6901,6902],{},"pylint","), démonstrateurs (Coq, Lean), vérification de modèles. Ils ne\nrésolvent pas le problème de l'arrêt en général, mais répondent\n",[603,6905,6906],{},"correctement sur les cas qu'ils savent traiter"," — et ",[603,6909,6910],{},"refusent de\nrépondre"," ailleurs.",[594,6913,1488],{"id":1487},[599,6915,6916,6917,1565,6920,6923],{},"Le résultat de Turing (1936) a précédé l'existence des ordinateurs. Il\nfonde l'informatique théorique : ce que vous lisez sur le problème P vs NP,\nsur les machines quantiques, sur la cryptographie, repose sur cette\ndistinction entre ",[603,6918,6919],{},"ce qui peut être calculé",[603,6921,6922],{},"ce qui ne le peut pas",".\nLe programme officiel s'arrête à l'argument informel — mais vous avez vu\nl'essentiel.",[612,6925],{"code":6303},[1513,6927,6928],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":798,"searchDepth":833,"depth":833,"links":6930},[6931,6932,6933,6934,6935,6936,6937],{"id":596,"depth":833,"text":597},{"id":6339,"depth":833,"text":6340},{"id":6476,"depth":833,"text":6477},{"id":6544,"depth":833,"text":6545},{"id":6594,"depth":833,"text":6595},{"id":6865,"depth":833,"text":6866},{"id":1487,"depth":833,"text":1488},"Un programme est une donnée pour un autre programme ; certaines questions sur les programmes n'admettent aucune réponse algorithmique — c'est le problème de l'arrêt.",{},[6941,6943],{"slug":6523,"kind":1535,"question":6528,"choices":6942,"correct":897,"multi":1537,"explanation":798},[6535,6538,6541],{"slug":6844,"kind":1535,"question":6849,"choices":6944,"correct":1352,"multi":1537,"explanation":798},[6856,6859,6862],{"title":557,"description":6938},"_RCCzevtohoYq21_WhvTMub0VwRYY-VIdP848kO3KyU",{"id":6948,"title":381,"bo":6949,"body":6950,"description":7071,"eval":1530,"extension":1531,"labo":1530,"meta":7072,"navigation":1123,"path":537,"quizzes":7074,"readingTime":805,"seo":7075,"stem":538,"tp":1530,"__hash__":7076},"cours\u002F2.nsi-tale\u002Ftd-langages-prog\u002F0.index.md",[589,1546,6303,5455,2438],{"type":591,"value":6951,"toc":7067},[6952,6956,6969,6972,7015,7023,7027,7060],[594,6953,6955],{"id":6954},"au-programme","Au programme",[599,6957,6958,6959,6962,6963,1565,6966,614],{},"Le chapitre TD prolonge ce que vous savez déjà programmer et l'élève au rang\nd'",[603,6960,6961],{},"ingénierie"," : on n'écrit plus seulement du code qui marche, on écrit du code\nqui se relit, se documente, se teste, se réutilise — et on prend enfin le recul\nthéorique nécessaire pour comprendre ",[603,6964,6965],{},"ce qu'un programme est",[603,6967,6968],{},"ce qu'aucun\nprogramme ne pourra jamais faire",[599,6970,6971],{},"Vous y apprenez à :",[908,6973,6974,6987,6993,6999,7005],{},[911,6975,6976,6979,6980,6983,6984,6986],{},[603,6977,6978],{},"anticiper les bugs"," (TD01) : typage, effets de bord, débordements de\ntableaux, conditionnelles non-exhaustives, comparaisons de flottants — et à\ndurcir vos programmes par des ",[674,6981,6982],{},"assert",", des doctests et un jeu de tests\n",[674,6985,1081],{}," ;",[911,6988,6989,6992],{},[603,6990,6991],{},"moduler votre code"," (TD02) : utiliser des bibliothèques, exploiter leur\ndocumentation, créer vos propres modules documentés ;",[911,6994,6995,6998],{},[603,6996,6997],{},"penser récursivement"," (TD05) : écrire et analyser des programmes\nrécursifs, comprendre la pile d'appels, dompter l'explosion exponentielle\npar mémoïsation ;",[911,7000,7001,7004],{},[603,7002,7003],{},"distinguer trois paradigmes"," (TD04) : impératif, fonctionnel, objet — et\nvoir le même problème résolu trois fois ;",[911,7006,7007,7010,7011,7014],{},[603,7008,7009],{},"prendre du recul"," (TD03) : un programme est une donnée pour un autre\nprogramme (interpréteur, compilateur), la calculabilité ne dépend pas du\nlangage, et le ",[603,7012,7013],{},"problème de l'arrêt"," est indécidable.",[7016,7017,7020],"card",{"icon":7018,"title":7019},"i-lucide-check","Pré-requis",[599,7021,7022],{},"Le chapitre PG (Langages et programmation de Première) est un appui direct,\nnotamment pour les spécifications, les assertions et la première rencontre\navec les fonctions. La récursivité est nouvelle en Terminale.",[594,7024,7026],{"id":7025},"plan","Plan",[1831,7028,7029,7036,7044,7049,7054],{},[911,7030,7031,7033,7034,614],{},[603,7032,403],{}," — TD01 — typage, effets de bord, pièges\nclassiques, assertions, doctests, jeux de tests avec ",[674,7035,1081],{},[911,7037,7038,7040,7041,7043],{},[603,7039,545],{}," — TD02 — ",[674,7042,1222],{},", modules, packages, bibliothèques,\nexploitation de doc, création d'un module documenté.",[911,7045,7046,7048],{},[603,7047,549],{}," — TD05 — programmes récursifs, pile d'appels, factorielle,\nFibonacci naïf vs mémoïsé, terminaison et relations de récurrence.",[911,7050,7051,7053],{},[603,7052,553],{}," — TD04 — impératif, fonctionnel, objet :\nun même problème résolu dans les trois.",[911,7055,7056,7059],{},[603,7057,7058],{},"Programme comme donnée"," — TD03 — interpréteur, compilateur,\ncalculabilité, problème de l'arrêt et argument d'auto-référence.",[599,7061,7062,7063,7066],{},"À la fin du chapitre, une fiche mémo de synthèse consolide les notions et\npropose une auto-évaluation. La source MDC d'évaluation notée\n(",[674,7064,7065],{},"chapitre.eval.md",") prépare le DS de fin de séquence.",{"title":798,"searchDepth":833,"depth":833,"links":7068},[7069,7070],{"id":6954,"depth":833,"text":6955},{"id":7025,"depth":833,"text":7026},"Mise au point des programmes, modularité, récursivité, paradigmes et grand vertige final — un programme est aussi une donnée, et tout n'est pas calculable.",{"icon":7073},"i-lucide-braces",[],{"title":381,"description":7071},"SygxHdarx0kf7H5_F-N0kloGu8cCQ_HEZvB-sEhD5uw",[7078,7353,7622,8430,8724,8926],{"id":7079,"title":7080,"bo":7081,"body":7082,"description":7346,"eval":1530,"extension":1531,"labo":1530,"meta":7347,"navigation":1537,"path":7348,"quizzes":7349,"readingTime":805,"seo":7350,"stem":7351,"tp":1530,"__hash__":7352},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.memo.md","Mise au point des programmes — l'essentiel",[589],{"type":591,"value":7083,"toc":7339},[7084,7088,7093,7097,7149,7153,7230,7234,7257,7261,7336],[594,7085,7087],{"id":7086},"en-une-phrase","En une phrase",[599,7089,7090],{},[603,7091,7092],{},"Anticiper les bugs typiques (typage, hors-bornes, flottants, effets de bord, cas oubliés) et vérifier le code par assertions + jeu de tests automatisé.",[594,7094,7096],{"id":7095},"à-mémoriser","À mémoriser",[908,7098,7099,7105,7115,7125,7134],{},[911,7100,7101,7104],{},[603,7102,7103],{},"Cinq familles de bugs"," : typage, effets de bord, hors-bornes, conditionnelles non-exhaustives, comparaisons de flottants.",[911,7106,7107,689,7112,7114],{},[603,7108,7109],{},[674,7110,7111],{},"assert \u003Ccondition>, \"message\"",[674,7113,932],{}," si la condition est fausse — à utiliser en pré\u002Fpost-condition et pour les invariants.",[911,7116,7117,7122,7123,614],{},[603,7118,7119],{},[674,7120,7121],{},"0.1 + 0.2 != 0.3"," en Python (flottants binaires) — comparer via ",[674,7124,783],{},[911,7126,7127,7130,7131,614],{},[603,7128,7129],{},"Doctest"," : exemples dans la docstring, exécutés par ",[674,7132,7133],{},"python -m doctest",[911,7135,7136,7140,7141,7143,7144,7146,7147,614],{},[603,7137,7138],{},[674,7139,1081],{}," : fichiers ",[674,7142,1363],{},", fonctions ",[674,7145,1367],{},", lancement ",[674,7148,1081],{},[594,7150,7152],{"id":7151},"à-savoir-reconnaître","À savoir reconnaître",[641,7154,7155,7165],{},[644,7156,7157],{},[647,7158,7159,7162],{},[650,7160,7161],{},"Situation",[650,7163,7164],{},"Action",[660,7166,7167,7180,7197,7211],{},[647,7168,7169,7175],{},[665,7170,7171,7172,7174],{},"Comparaison ",[674,7173,1259],{}," entre flottants",[665,7176,7177,7178,614],{},"Utiliser une tolérance ",[674,7179,787],{},[647,7181,7182,7188],{},[665,7183,7184,7185,3098],{},"Argument mutable par défaut (",[674,7186,7187],{},"l=[]",[665,7189,7190,7191,7194,7195,614],{},"Remplacer par ",[674,7192,7193],{},"l=None"," + ",[674,7196,1458],{},[647,7198,7199,7204],{},[665,7200,7201,7203],{},[674,7202,1406],{}," qui « rate » la dernière valeur",[665,7205,7206,7207,7210],{},"Penser à ",[674,7208,7209],{},"range(n+1)"," si bornes inclusives.",[647,7212,7213,7221],{},[665,7214,7215,7216,749,7218,7220],{},"Cascade ",[674,7217,743],{},[674,7219,752],{}," final",[665,7222,7223,7224,7226,7227,614],{},"Ajouter un ",[674,7225,752],{}," ou un ",[674,7228,7229],{},"raise",[594,7231,7233],{"id":7232},"pièges-courants","Pièges courants",[908,7235,7236,7244,7247],{},[911,7237,7238,7239,7241,7242,614],{},"Comparer ",[674,7240,1433],{}," (lexicographique) au lieu de convertir en ",[674,7243,676],{},[911,7245,7246],{},"Modifier une liste qu'on parcourt en même temps.",[911,7248,7249,7250,7252,7253,7256],{},"Oublier qu'",[674,7251,6982],{}," est désactivable avec ",[674,7254,7255],{},"python -O"," — ne pas l'utiliser pour la sécurité.",[594,7258,7260],{"id":7259},"syntaxe-python","Syntaxe Python",[793,7262,7264],{"className":795,"code":7263,"language":797,"meta":798,"style":798},"def division_entiere(a: int, b: int) -> int:\n    \"\"\"Quotient entier.\n\n    >>> division_entiere(10, 3)\n    3\n    \"\"\"\n    assert b != 0, \"division par zéro\"\n    return a \u002F\u002F b\n",[674,7265,7266,7286,7291,7295,7302,7307,7311,7326],{"__ignoreMap":798},[802,7267,7268,7270,7272,7274,7276,7278,7280,7282,7284],{"class":804,"line":805},[802,7269,943],{"class":819},[802,7271,947],{"class":946},[802,7273,950],{"class":812},[802,7275,676],{"class":808},[802,7277,955],{"class":812},[802,7279,676],{"class":808},[802,7281,960],{"class":812},[802,7283,676],{"class":808},[802,7285,965],{"class":812},[802,7287,7288],{"class":804,"line":833},[802,7289,7290],{"class":970},"    \"\"\"Quotient entier.\n",[802,7292,7293],{"class":804,"line":858},[802,7294,1124],{"emptyLinePlaceholder":1123},[802,7296,7297,7299],{"class":804,"line":993},[802,7298,1129],{"class":819},[802,7300,7301],{"class":970},"division_entiere(10, 3)\n",[802,7303,7304],{"class":804,"line":1010},[802,7305,7306],{"class":970},"    3\n",[802,7308,7309],{"class":804,"line":1029},[802,7310,1170],{"class":970},[802,7312,7313,7315,7317,7319,7321,7323],{"class":804,"line":1147},[802,7314,976],{"class":819},[802,7316,1015],{"class":812},[802,7318,1018],{"class":819},[802,7320,1021],{"class":808},[802,7322,677],{"class":812},[802,7324,7325],{"class":970},"\"division par zéro\"\n",[802,7327,7328,7330,7332,7334],{"class":804,"line":1153},[802,7329,1032],{"class":819},[802,7331,1035],{"class":812},[802,7333,1038],{"class":819},[802,7335,1041],{"class":812},[1513,7337,7338],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":798,"searchDepth":833,"depth":833,"links":7340},[7341,7342,7343,7344,7345],{"id":7086,"depth":833,"text":7087},{"id":7095,"depth":833,"text":7096},{"id":7151,"depth":833,"text":7152},{"id":7232,"depth":833,"text":7233},{"id":7259,"depth":833,"text":7260},"Mémo de révision sur les bugs typiques et l'outillage de test.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point.memo",[],{"title":7080,"description":7346},"2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point.memo","g3I2Tb8nggcC4QQ6n_IeevSVSHldiZri7FqAlK8AfN8",{"id":7354,"title":7355,"bo":7356,"body":7357,"description":7615,"eval":1530,"extension":1531,"labo":1530,"meta":7616,"navigation":1537,"path":7617,"quizzes":7618,"readingTime":805,"seo":7619,"stem":7620,"tp":1530,"__hash__":7621},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite.memo.md","Modularité — l'essentiel",[1546],{"type":591,"value":7358,"toc":7608},[7359,7361,7369,7371,7420,7422,7463,7465,7484,7486,7578,7605],[594,7360,7087],{"id":7086},[599,7362,7363],{},[603,7364,7365,7366,7368],{},"Un module est un fichier ",[674,7367,1626],{}," importable ; on consomme les bibliothèques via leur doc, on produit ses propres modules documentés et typés.",[594,7370,7096],{"id":7095},[908,7372,7373,7389,7394,7406,7414],{},[911,7374,7375,7377,7378,7380,7381,7383,7384,7380,7386,7388],{},[603,7376,1620],{}," = fichier ",[674,7379,1626],{},". ",[603,7382,1639],{}," = dossier avec ",[674,7385,1645],{},[603,7387,1658],{}," = ensemble cohérent.",[911,7390,7391,7393],{},[603,7392,1677],{}," = surface publique d'une bibliothèque (fonctions, classes exposées).",[911,7395,7396,1411,7399,677,7401,677,7403,614],{},[603,7397,7398],{},"Imports",[674,7400,1812],{},[674,7402,1815],{},[674,7404,7405],{},"import numpy as np",[911,7407,7408,1411,7411,7413],{},[603,7409,7410],{},"Documentation",[674,7412,1919],{},", doc en ligne, code source en dernier recours.",[911,7415,7416,7419],{},[603,7417,7418],{},"Un bon module"," = docstring de module + docstrings par fonction + typage + tests\u002Fdoctests.",[594,7421,7152],{"id":7151},[641,7423,7424,7432],{},[644,7425,7426],{},[647,7427,7428,7430],{},[650,7429,7161],{},[650,7431,7164],{},[660,7433,7434,7444,7455],{},[647,7435,7436,7439],{},[665,7437,7438],{},"Nom de bibliothèque inconnu",[665,7440,7441,7443],{},[674,7442,1919],{}," dans l'interpréteur.",[647,7445,7446,7449],{},[665,7447,7448],{},"Conflit de noms entre modules",[665,7450,7451,7452,6192],{},"Utiliser un alias (",[674,7453,7454],{},"import x as y",[647,7456,7457,7460],{},[665,7458,7459],{},"Code répété entre deux scripts",[665,7461,7462],{},"Extraire dans un module commun.",[594,7464,7233],{"id":7232},[908,7466,7467,7472,7481],{},[911,7468,7469,7471],{},[674,7470,1788],{}," : pollue l'espace de noms.",[911,7473,7474,7475,7478,7479,614],{},"Oublier la docstring de module — ",[674,7476,7477],{},"help(mon_module)"," retourne alors ",[674,7480,5220],{},[911,7482,7483],{},"Ne pas typer les paramètres — l'utilisateur ne sait pas ce qu'on attend.",[594,7485,7260],{"id":7259},[793,7487,7489],{"className":795,"code":7488,"language":797,"meta":798,"style":798},"# geom.py\n\"\"\"Primitives géométriques.\"\"\"\nfrom math import pi\n\ndef aire_cercle(rayon: float) -> float:\n    \"\"\"Aire d'un disque de rayon donné.\n\n    >>> round(aire_cercle(1), 4)\n    3.1416\n    \"\"\"\n    assert rayon >= 0\n    return pi * rayon ** 2\n",[674,7490,7491,7496,7501,7511,7515,7531,7536,7540,7546,7550,7554,7564],{"__ignoreMap":798},[802,7492,7493],{"class":804,"line":805},[802,7494,7495],{"class":829},"# geom.py\n",[802,7497,7498],{"class":804,"line":833},[802,7499,7500],{"class":970},"\"\"\"Primitives géométriques.\"\"\"\n",[802,7502,7503,7505,7507,7509],{"class":804,"line":858},[802,7504,1216],{"class":819},[802,7506,1742],{"class":812},[802,7508,1222],{"class":819},[802,7510,1987],{"class":812},[802,7512,7513],{"class":804,"line":993},[802,7514,1124],{"emptyLinePlaceholder":1123},[802,7516,7517,7519,7521,7523,7525,7527,7529],{"class":804,"line":1010},[802,7518,943],{"class":819},[802,7520,2002],{"class":946},[802,7522,2005],{"class":812},[802,7524,680],{"class":808},[802,7526,960],{"class":812},[802,7528,680],{"class":808},[802,7530,965],{"class":812},[802,7532,7533],{"class":804,"line":1029},[802,7534,7535],{"class":970},"    \"\"\"Aire d'un disque de rayon donné.\n",[802,7537,7538],{"class":804,"line":1147},[802,7539,1124],{"emptyLinePlaceholder":1123},[802,7541,7542,7544],{"class":804,"line":1153},[802,7543,1129],{"class":819},[802,7545,2030],{"class":970},[802,7547,7548],{"class":804,"line":1161},[802,7549,2036],{"class":970},[802,7551,7552],{"class":804,"line":1167},[802,7553,1170],{"class":970},[802,7555,7556,7558,7560,7562],{"class":804,"line":1173},[802,7557,976],{"class":819},[802,7559,2049],{"class":812},[802,7561,2052],{"class":819},[802,7563,4226],{"class":808},[802,7565,7566,7568,7570,7572,7574,7576],{"class":804,"line":1328},[802,7567,1032],{"class":819},[802,7569,2067],{"class":812},[802,7571,2070],{"class":819},[802,7573,2049],{"class":812},[802,7575,2075],{"class":819},[802,7577,2078],{"class":808},[793,7579,7581],{"className":795,"code":7580,"language":797,"meta":798,"style":798},"# main.py\nimport geom\nprint(geom.aire_cercle(2))\n",[674,7582,7583,7588,7594],{"__ignoreMap":798},[802,7584,7585],{"class":804,"line":805},[802,7586,7587],{"class":829},"# main.py\n",[802,7589,7590,7592],{"class":804,"line":833},[802,7591,1222],{"class":819},[802,7593,2290],{"class":812},[802,7595,7596,7598,7600,7602],{"class":804,"line":858},[802,7597,809],{"class":808},[802,7599,2301],{"class":812},[802,7601,1292],{"class":808},[802,7603,7604],{"class":812},"))\n",[1513,7606,7607],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":798,"searchDepth":833,"depth":833,"links":7609},[7610,7611,7612,7613,7614],{"id":7086,"depth":833,"text":7087},{"id":7095,"depth":833,"text":7096},{"id":7151,"depth":833,"text":7152},{"id":7232,"depth":833,"text":7233},{"id":7259,"depth":833,"text":7260},"Mémo de révision sur modules, packages, bibliothèques et création de modules documentés.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmodularite.memo",[],{"title":7355,"description":7615},"2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite.memo","7JBXkGhe3Y-q7BsEV7ul9f0TOZu_AxVP09HN58_wi1E",{"id":7623,"title":7624,"bo":7625,"body":7626,"description":8423,"eval":1530,"extension":1531,"labo":1530,"meta":8424,"navigation":1537,"path":8425,"quizzes":8426,"readingTime":805,"seo":8427,"stem":8428,"tp":1530,"__hash__":8429},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite.memo.md","Récursivité — l'essentiel",[2438],{"type":591,"value":7627,"toc":8416},[7628,7630,7635,7637,8277,8279,8317,8319,8330,8332,8413],[594,7629,7087],{"id":7086},[599,7631,7632],{},[603,7633,7634],{},"Une fonction récursive s'appelle sur une entrée strictement plus petite jusqu'à un cas de base ; bien analysée par une relation de récurrence, mémoïsée si nécessaire.",[594,7636,7096],{"id":7095},[908,7638,7639,7645,7651,7871,8180,8266],{},[911,7640,7641,7644],{},[603,7642,7643],{},"Deux ingrédients"," : cas de base (terminaison) + cas récursif (réduction).",[911,7646,7647,7650],{},[603,7648,7649],{},"Pile d'appels"," : chaque appel empile un cadre ; profondeur max ~1000 en Python.",[911,7652,7653,1411,7656,614],{},[603,7654,7655],{},"Factorielle",[802,7657,7659,7724],{"className":7658},[2781],[802,7660,7662],{"className":7661},[2785],[1698,7663,7664],{"xmlns":2788},[2790,7665,7666,7721],{},[2793,7667,7668,7670,7672,7674,7676,7678,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7703,7705,7707,7709,7711,7713,7715,7717,7719],{},[3088,7669,3090],{},[2799,7671,813],{"stretchy":3093},[3088,7673,1410],{},[2799,7675,3098],{"stretchy":3093},[2799,7677,2811],{},[3088,7679,3090],{},[2799,7681,813],{"stretchy":3093},[3088,7683,1410],{},[2799,7685,3165],{},[2796,7687,897],{},[2799,7689,3098],{"stretchy":3093},[2799,7691,3172],{},[3088,7693,3175],{},[2799,7695,813],{"stretchy":3093},[2796,7697,897],{},[2799,7699,3098],{"stretchy":3093},[2799,7701,7702],{},"⇒",[3088,7704,3090],{},[2799,7706,813],{"stretchy":3093},[3088,7708,1410],{},[2799,7710,3098],{"stretchy":3093},[2799,7712,2811],{},[3088,7714,3175],{},[2799,7716,813],{"stretchy":3093},[3088,7718,1410],{},[2799,7720,3098],{"stretchy":3093},[2840,7722,7723],{"encoding":2842},"T(n) = T(n-1) + O(1) \\Rightarrow T(n) = O(n)",[802,7725,7727,7754,7778,7799,7826,7853],{"className":7726,"ariaHidden":2848},[2847],[802,7728,7730,7733,7736,7739,7742,7745,7748,7751],{"className":7729},[2852],[802,7731],{"className":7732,"style":3111},[2856],[802,7734,3090],{"className":7735,"style":3116},[2861,3115],[802,7737,813],{"className":7738},[3120],[802,7740,1410],{"className":7741},[2861,3115],[802,7743,3098],{"className":7744},[3127],[802,7746],{"className":7747,"style":2866},[2865],[802,7749,2811],{"className":7750},[2870],[802,7752],{"className":7753,"style":2866},[2865],[802,7755,7757,7760,7763,7766,7769,7772,7775],{"className":7756},[2852],[802,7758],{"className":7759,"style":3111},[2856],[802,7761,3090],{"className":7762,"style":3116},[2861,3115],[802,7764,813],{"className":7765},[3120],[802,7767,1410],{"className":7768},[2861,3115],[802,7770],{"className":7771,"style":2887},[2865],[802,7773,3165],{"className":7774},[2891],[802,7776],{"className":7777,"style":2887},[2865],[802,7779,7781,7784,7787,7790,7793,7796],{"className":7780},[2852],[802,7782],{"className":7783,"style":3111},[2856],[802,7785,897],{"className":7786},[2861],[802,7788,3098],{"className":7789},[3127],[802,7791],{"className":7792,"style":2887},[2865],[802,7794,3172],{"className":7795},[2891],[802,7797],{"className":7798,"style":2887},[2865],[802,7800,7802,7805,7808,7811,7814,7817,7820,7823],{"className":7801},[2852],[802,7803],{"className":7804,"style":3111},[2856],[802,7806,3175],{"className":7807,"style":3296},[2861,3115],[802,7809,813],{"className":7810},[3120],[802,7812,897],{"className":7813},[2861],[802,7815,3098],{"className":7816},[3127],[802,7818],{"className":7819,"style":2866},[2865],[802,7821,7702],{"className":7822},[2870],[802,7824],{"className":7825,"style":2866},[2865],[802,7827,7829,7832,7835,7838,7841,7844,7847,7850],{"className":7828},[2852],[802,7830],{"className":7831,"style":3111},[2856],[802,7833,3090],{"className":7834,"style":3116},[2861,3115],[802,7836,813],{"className":7837},[3120],[802,7839,1410],{"className":7840},[2861,3115],[802,7842,3098],{"className":7843},[3127],[802,7845],{"className":7846,"style":2866},[2865],[802,7848,2811],{"className":7849},[2870],[802,7851],{"className":7852,"style":2866},[2865],[802,7854,7856,7859,7862,7865,7868],{"className":7855},[2852],[802,7857],{"className":7858,"style":3111},[2856],[802,7860,3175],{"className":7861,"style":3296},[2861,3115],[802,7863,813],{"className":7864},[3120],[802,7866,1410],{"className":7867},[2861,3115],[802,7869,3098],{"className":7870},[3127],[911,7872,7873,1411,7876,8179],{},[603,7874,7875],{},"Fibonacci naïf",[802,7877,7879,7961],{"className":7878},[2781],[802,7880,7882],{"className":7881},[2785],[1698,7883,7884],{"xmlns":2788},[2790,7885,7886,7958],{},[2793,7887,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7936,7938,7940,7942,7944,7946,7948,7950,7956],{},[3088,7889,3090],{},[2799,7891,813],{"stretchy":3093},[3088,7893,1410],{},[2799,7895,3098],{"stretchy":3093},[2799,7897,2811],{},[3088,7899,3090],{},[2799,7901,813],{"stretchy":3093},[3088,7903,1410],{},[2799,7905,3165],{},[2796,7907,897],{},[2799,7909,3098],{"stretchy":3093},[2799,7911,3172],{},[3088,7913,3090],{},[2799,7915,813],{"stretchy":3093},[3088,7917,1410],{},[2799,7919,3165],{},[2796,7921,1292],{},[2799,7923,3098],{"stretchy":3093},[2799,7925,3172],{},[3088,7927,3175],{},[2799,7929,813],{"stretchy":3093},[2796,7931,897],{},[2799,7933,3098],{"stretchy":3093},[2799,7935,7702],{},[3088,7937,3090],{},[2799,7939,813],{"stretchy":3093},[3088,7941,1410],{},[2799,7943,3098],{"stretchy":3093},[2799,7945,2811],{},[3088,7947,3175],{},[2799,7949,813],{"stretchy":3093},[4506,7951,7952,7954],{},[3088,7953,4510],{},[3088,7955,1410],{},[2799,7957,3098],{"stretchy":3093},[2840,7959,7960],{"encoding":2842},"T(n) = T(n-1) + T(n-2) + O(1) \\Rightarrow T(n) = O(\\varphi^n)",[802,7962,7964,7991,8015,8036,8060,8081,8108,8135],{"className":7963,"ariaHidden":2848},[2847],[802,7965,7967,7970,7973,7976,7979,7982,7985,7988],{"className":7966},[2852],[802,7968],{"className":7969,"style":3111},[2856],[802,7971,3090],{"className":7972,"style":3116},[2861,3115],[802,7974,813],{"className":7975},[3120],[802,7977,1410],{"className":7978},[2861,3115],[802,7980,3098],{"className":7981},[3127],[802,7983],{"className":7984,"style":2866},[2865],[802,7986,2811],{"className":7987},[2870],[802,7989],{"className":7990,"style":2866},[2865],[802,7992,7994,7997,8000,8003,8006,8009,8012],{"className":7993},[2852],[802,7995],{"className":7996,"style":3111},[2856],[802,7998,3090],{"className":7999,"style":3116},[2861,3115],[802,8001,813],{"className":8002},[3120],[802,8004,1410],{"className":8005},[2861,3115],[802,8007],{"className":8008,"style":2887},[2865],[802,8010,3165],{"className":8011},[2891],[802,8013],{"className":8014,"style":2887},[2865],[802,8016,8018,8021,8024,8027,8030,8033],{"className":8017},[2852],[802,8019],{"className":8020,"style":3111},[2856],[802,8022,897],{"className":8023},[2861],[802,8025,3098],{"className":8026},[3127],[802,8028],{"className":8029,"style":2887},[2865],[802,8031,3172],{"className":8032},[2891],[802,8034],{"className":8035,"style":2887},[2865],[802,8037,8039,8042,8045,8048,8051,8054,8057],{"className":8038},[2852],[802,8040],{"className":8041,"style":3111},[2856],[802,8043,3090],{"className":8044,"style":3116},[2861,3115],[802,8046,813],{"className":8047},[3120],[802,8049,1410],{"className":8050},[2861,3115],[802,8052],{"className":8053,"style":2887},[2865],[802,8055,3165],{"className":8056},[2891],[802,8058],{"className":8059,"style":2887},[2865],[802,8061,8063,8066,8069,8072,8075,8078],{"className":8062},[2852],[802,8064],{"className":8065,"style":3111},[2856],[802,8067,1292],{"className":8068},[2861],[802,8070,3098],{"className":8071},[3127],[802,8073],{"className":8074,"style":2887},[2865],[802,8076,3172],{"className":8077},[2891],[802,8079],{"className":8080,"style":2887},[2865],[802,8082,8084,8087,8090,8093,8096,8099,8102,8105],{"className":8083},[2852],[802,8085],{"className":8086,"style":3111},[2856],[802,8088,3175],{"className":8089,"style":3296},[2861,3115],[802,8091,813],{"className":8092},[3120],[802,8094,897],{"className":8095},[2861],[802,8097,3098],{"className":8098},[3127],[802,8100],{"className":8101,"style":2866},[2865],[802,8103,7702],{"className":8104},[2870],[802,8106],{"className":8107,"style":2866},[2865],[802,8109,8111,8114,8117,8120,8123,8126,8129,8132],{"className":8110},[2852],[802,8112],{"className":8113,"style":3111},[2856],[802,8115,3090],{"className":8116,"style":3116},[2861,3115],[802,8118,813],{"className":8119},[3120],[802,8121,1410],{"className":8122},[2861,3115],[802,8124,3098],{"className":8125},[3127],[802,8127],{"className":8128,"style":2866},[2865],[802,8130,2811],{"className":8131},[2870],[802,8133],{"className":8134,"style":2866},[2865],[802,8136,8138,8141,8144,8147,8176],{"className":8137},[2852],[802,8139],{"className":8140,"style":3111},[2856],[802,8142,3175],{"className":8143,"style":3296},[2861,3115],[802,8145,813],{"className":8146},[3120],[802,8148,8150,8153],{"className":8149},[2861],[802,8151,4510],{"className":8152},[2861,3115],[802,8154,8156],{"className":8155},[3803],[802,8157,8159],{"className":8158},[3807],[802,8160,8162],{"className":8161},[3812],[802,8163,8165],{"className":8164,"style":4578},[3816],[802,8166,8167,8170],{"style":4581},[802,8168],{"className":8169,"style":3825},[3824],[802,8171,8173],{"className":8172},[3829,3830,3831,3832],[802,8174,1410],{"className":8175},[2861,3115,3832],[802,8177,3098],{"className":8178},[3127]," — exponentiel.",[911,8181,8182,8185,8186,614],{},[603,8183,8184],{},"Fibonacci mémoïsé"," : chaque valeur calculée une seule fois, ",[802,8187,8189,8218],{"className":8188},[2781],[802,8190,8192],{"className":8191},[2785],[1698,8193,8194],{"xmlns":2788},[2790,8195,8196,8216],{},[2793,8197,8198,8200,8202,8204,8206,8208,8210,8212,8214],{},[3088,8199,3090],{},[2799,8201,813],{"stretchy":3093},[3088,8203,1410],{},[2799,8205,3098],{"stretchy":3093},[2799,8207,2811],{},[3088,8209,3175],{},[2799,8211,813],{"stretchy":3093},[3088,8213,1410],{},[2799,8215,3098],{"stretchy":3093},[2840,8217,3696],{"encoding":2842},[802,8219,8221,8248],{"className":8220,"ariaHidden":2848},[2847],[802,8222,8224,8227,8230,8233,8236,8239,8242,8245],{"className":8223},[2852],[802,8225],{"className":8226,"style":3111},[2856],[802,8228,3090],{"className":8229,"style":3116},[2861,3115],[802,8231,813],{"className":8232},[3120],[802,8234,1410],{"className":8235},[2861,3115],[802,8237,3098],{"className":8238},[3127],[802,8240],{"className":8241,"style":2866},[2865],[802,8243,2811],{"className":8244},[2870],[802,8246],{"className":8247,"style":2866},[2865],[802,8249,8251,8254,8257,8260,8263],{"className":8250},[2852],[802,8252],{"className":8253,"style":3111},[2856],[802,8255,3175],{"className":8256,"style":3296},[2861,3115],[802,8258,813],{"className":8259},[3120],[802,8261,1410],{"className":8262},[2861,3115],[802,8264,3098],{"className":8265},[3127],[911,8267,8268,8272,8273,8276],{},[603,8269,8270],{},[674,8271,5209],{}," (module ",[674,8274,8275],{},"functools",") : mémoïsation déclarative.",[594,8278,7152],{"id":7151},[641,8280,8281,8289],{},[644,8282,8283],{},[647,8284,8285,8287],{},[650,8286,7161],{},[650,8288,7164],{},[660,8290,8291,8301,8309],{},[647,8292,8293,8296],{},[665,8294,8295],{},"Récursion sans cas de base",[665,8297,8298,8300],{},[674,8299,2656],{}," garantie.",[647,8302,8303,8306],{},[665,8304,8305],{},"Sous-problèmes recalculés (Fibonacci, chemins)",[665,8307,8308],{},"Mémoïser.",[647,8310,8311,8314],{},[665,8312,8313],{},"Profondeur d'appel proche de 1000",[665,8315,8316],{},"Repenser en itératif ou augmenter la limite.",[594,8318,7233],{"id":7232},[908,8320,8321,8324,8327],{},[911,8322,8323],{},"Oublier le cas de base — récursion infinie.",[911,8325,8326],{},"Faire récursion sur une entrée qui ne diminue pas strictement.",[911,8328,8329],{},"Ne pas mémoïser quand les sous-problèmes se chevauchent.",[594,8331,7260],{"id":7259},[793,8333,8335],{"className":795,"code":8334,"language":797,"meta":798,"style":798},"from functools import lru_cache\n\n@lru_cache(maxsize=None)\ndef fib(n):\n    if n \u003C 2:\n        return n\n    return fib(n - 1) + fib(n - 2)\n",[674,8336,8337,8347,8351,8365,8373,8385,8391],{"__ignoreMap":798},[802,8338,8339,8341,8343,8345],{"class":804,"line":805},[802,8340,1216],{"class":819},[802,8342,5195],{"class":812},[802,8344,1222],{"class":819},[802,8346,5200],{"class":812},[802,8348,8349],{"class":804,"line":833},[802,8350,1124],{"emptyLinePlaceholder":1123},[802,8352,8353,8355,8357,8359,8361,8363],{"class":804,"line":858},[802,8354,5209],{"class":946},[802,8356,813],{"class":812},[802,8358,5215],{"class":5214},[802,8360,2811],{"class":819},[802,8362,5220],{"class":808},[802,8364,1355],{"class":812},[802,8366,8367,8369,8371],{"class":804,"line":993},[802,8368,943],{"class":819},[802,8370,5229],{"class":946},[802,8372,2672],{"class":812},[802,8374,8375,8377,8379,8381,8383],{"class":804,"line":1010},[802,8376,2592],{"class":819},[802,8378,2578],{"class":812},[802,8380,884],{"class":819},[802,8382,1178],{"class":808},[802,8384,965],{"class":812},[802,8386,8387,8389],{"class":804,"line":1029},[802,8388,2609],{"class":819},[802,8390,1184],{"class":812},[802,8392,8393,8395,8397,8399,8401,8403,8405,8407,8409,8411],{"class":804,"line":1147},[802,8394,1032],{"class":819},[802,8396,5264],{"class":812},[802,8398,1284],{"class":819},[802,8400,2628],{"class":808},[802,8402,881],{"class":812},[802,8404,3172],{"class":819},[802,8406,5264],{"class":812},[802,8408,1284],{"class":819},[802,8410,1178],{"class":808},[802,8412,1355],{"class":812},[1513,8414,8415],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":798,"searchDepth":833,"depth":833,"links":8417},[8418,8419,8420,8421,8422],{"id":7086,"depth":833,"text":7087},{"id":7095,"depth":833,"text":7096},{"id":7151,"depth":833,"text":7152},{"id":7232,"depth":833,"text":7233},{"id":7259,"depth":833,"text":7260},"Mémo de révision sur la récursivité, la pile d'appels et la mémoïsation.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Frecursivite.memo",[],{"title":7624,"description":8423},"2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite.memo","JT23HNndr7cjgKLnEzScZSRus_CTtrxkIa2DffbynRA",{"id":8431,"title":8432,"bo":8433,"body":8434,"description":8717,"eval":1530,"extension":1531,"labo":1530,"meta":8718,"navigation":1537,"path":8719,"quizzes":8720,"readingTime":805,"seo":8721,"stem":8722,"tp":1530,"__hash__":8723},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes.memo.md","Paradigmes de programmation — l'essentiel",[5455],{"type":591,"value":8435,"toc":8710},[8436,8438,8443,8445,8491,8493,8546,8548,8563,8565,8707],[594,8437,7087],{"id":7086},[599,8439,8440],{},[603,8441,8442],{},"Un paradigme est une manière de concevoir un programme ; impératif (instructions + état mutable), fonctionnel (fonctions pures), objet (entités état + comportement) — un même langage permet les trois.",[594,8444,7096],{"id":7095},[908,8446,8447,8456,8464,8470,8485],{},[911,8448,8449,8451,8452,8455],{},[603,8450,5553],{}," : variables, affectations, boucles. ",[6333,8453,8454],{},"Comment"," calculer pas à pas.",[911,8457,8458,8460,8461,5751],{},[603,8459,5570],{}," : fonctions pures, pas d'effet de bord, composition. ",[6333,8462,8463],{},"Quoi",[911,8465,8466,8469],{},[603,8467,8468],{},"Objet"," : classes, instances, méthodes — encapsulation de l'état dans l'objet.",[911,8471,8472,8473,677,8477,677,8481,614],{},"Primitives fonctionnelles : ",[603,8474,8475],{},[674,8476,6185],{},[603,8478,8479],{},[674,8480,6188],{},[603,8482,8483],{},[674,8484,6191],{},[911,8486,925,8487,8490],{},[603,8488,8489],{},"fonction pure"," ne mute rien et donne toujours le même résultat sur les mêmes arguments.",[594,8492,7152],{"id":7151},[641,8494,8495,8505],{},[644,8496,8497],{},[647,8498,8499,8502],{},[650,8500,8501],{},"Style",[650,8503,8504],{},"Indice",[660,8506,8507,8516,8534],{},[647,8508,8509,8511],{},[665,8510,5553],{},[665,8512,8513,8515],{},[674,8514,5746],{}," + variable accumulateur.",[647,8517,8518,8520],{},[665,8519,5570],{},[665,8521,8522,8524,8525,8524,8527,8524,8529,8524,8531,614],{},[674,8523,6185],{}," \u002F ",[674,8526,6188],{},[674,8528,6191],{},[674,8530,5869],{},[674,8532,8533],{},"lambda",[647,8535,8536,8538],{},[665,8537,8468],{},[665,8539,8540,677,8542,8545],{},[674,8541,5969],{},[674,8543,8544],{},"self",", instanciation puis appel de méthode.",[594,8547,7233],{"id":7232},[908,8549,8550,8557,8560],{},[911,8551,8552,8553,8556],{},"Confondre langage et paradigme (Python n'est pas « orienté objet », il ",[603,8554,8555],{},"permet"," l'objet).",[911,8558,8559],{},"Croire qu'un paradigme est universellement meilleur.",[911,8561,8562],{},"Forcer le fonctionnel sur un problème intrinsèquement stateful (UI, simulation).",[594,8564,7260],{"id":7259},[793,8566,8568],{"className":795,"code":8567,"language":797,"meta":798,"style":798},"# Impératif\ntotal = 0\nfor x in [1, 2, 3]: total += x\n\n# Fonctionnel\nsum([1, 2, 3])\n\n# Objet\nclass Somme:\n    def __init__(self): self._t = 0\n    def ajouter(self, x): self._t += x\n    def valeur(self): return self._t\n",[674,8569,8570,8575,8584,8611,8615,8620,8639,8643,8648,8656,8674,8691],{"__ignoreMap":798},[802,8571,8572],{"class":804,"line":805},[802,8573,8574],{"class":829},"# Impératif\n",[802,8576,8577,8580,8582],{"class":804,"line":833},[802,8578,8579],{"class":812},"total ",[802,8581,2811],{"class":819},[802,8583,4226],{"class":808},[802,8585,8586,8588,8590,8592,8594,8596,8598,8600,8602,8604,8607,8609],{"class":804,"line":858},[802,8587,5746],{"class":819},[802,8589,5665],{"class":812},[802,8591,1891],{"class":819},[802,8593,6084],{"class":812},[802,8595,897],{"class":808},[802,8597,677],{"class":812},[802,8599,1292],{"class":808},[802,8601,677],{"class":812},[802,8603,1254],{"class":808},[802,8605,8606],{"class":812},"]: total ",[802,8608,6029],{"class":819},[802,8610,6032],{"class":812},[802,8612,8613],{"class":804,"line":993},[802,8614,1124],{"emptyLinePlaceholder":1123},[802,8616,8617],{"class":804,"line":1010},[802,8618,8619],{"class":829},"# Fonctionnel\n",[802,8621,8622,8624,8626,8628,8630,8632,8634,8636],{"class":804,"line":1029},[802,8623,5869],{"class":808},[802,8625,5872],{"class":812},[802,8627,897],{"class":808},[802,8629,677],{"class":812},[802,8631,1292],{"class":808},[802,8633,677],{"class":812},[802,8635,1254],{"class":808},[802,8637,8638],{"class":812},"])\n",[802,8640,8641],{"class":804,"line":1147},[802,8642,1124],{"emptyLinePlaceholder":1123},[802,8644,8645],{"class":804,"line":1153},[802,8646,8647],{"class":829},"# Objet\n",[802,8649,8650,8652,8654],{"class":804,"line":1161},[802,8651,5969],{"class":819},[802,8653,5972],{"class":946},[802,8655,965],{"class":812},[802,8657,8658,8660,8662,8665,8667,8670,8672],{"class":804,"line":1167},[802,8659,5988],{"class":819},[802,8661,5991],{"class":808},[802,8663,8664],{"class":812},"(self): ",[802,8666,8544],{"class":808},[802,8668,8669],{"class":812},"._t ",[802,8671,2811],{"class":819},[802,8673,4226],{"class":808},[802,8675,8676,8678,8680,8683,8685,8687,8689],{"class":804,"line":1173},[802,8677,5988],{"class":819},[802,8679,6017],{"class":946},[802,8681,8682],{"class":812},"(self, x): ",[802,8684,8544],{"class":808},[802,8686,8669],{"class":812},[802,8688,6029],{"class":819},[802,8690,6032],{"class":812},[802,8692,8693,8695,8697,8699,8702,8704],{"class":804,"line":1328},[802,8694,5988],{"class":819},[802,8696,6043],{"class":946},[802,8698,8664],{"class":812},[802,8700,8701],{"class":819},"return",[802,8703,6052],{"class":808},[802,8705,8706],{"class":812},"._t\n",[1513,8708,8709],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":798,"searchDepth":833,"depth":833,"links":8711},[8712,8713,8714,8715,8716],{"id":7086,"depth":833,"text":7087},{"id":7095,"depth":833,"text":7096},{"id":7151,"depth":833,"text":7152},{"id":7232,"depth":833,"text":7233},{"id":7259,"depth":833,"text":7260},"Mémo de révision sur impératif, fonctionnel et orienté objet.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fparadigmes.memo",[],{"title":8432,"description":8717},"2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes.memo","UZN4nmzJlZXW_GjOrwXwGrZYWepOe3kBUgdda5QoRfU",{"id":8725,"title":8726,"bo":8727,"body":8728,"description":8919,"eval":1530,"extension":1531,"labo":1530,"meta":8920,"navigation":1537,"path":8921,"quizzes":8922,"readingTime":805,"seo":8923,"stem":8924,"tp":1530,"__hash__":8925},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee.memo.md","Programme comme donnée — l'essentiel",[6303],{"type":591,"value":8729,"toc":8912},[8730,8732,8737,8739,8792,8794,8832,8834,8849,8853,8909],[594,8731,7087],{"id":7086},[599,8733,8734],{},[603,8735,8736],{},"Un programme est une donnée pour un autre programme (interpréteur, compilateur) ; la calculabilité ne dépend pas du langage ; le problème de l'arrêt est indécidable — aucun programme ne peut décider pour TOUTE entrée si un programme arbitraire termine.",[594,8738,7096],{"id":7095},[908,8740,8741,8746,8751,8757,8763,8786],{},[911,8742,8743,8745],{},[603,8744,6386],{}," : lit et exécute (CPython, navigateur JS).",[911,8747,8748,8750],{},[603,8749,6399],{}," : traduit le source vers une autre langue (GCC, javac).",[911,8752,8753,8756],{},[603,8754,8755],{},"Thèse de Church-Turing"," : tous les langages Turing-complets calculent les mêmes fonctions (thèse, pas théorème).",[911,8758,8759,8762],{},[603,8760,8761],{},"Problème de l'arrêt"," : indécidable — démontré par Turing (1936).",[911,8764,8765,8768,8769,8771,8772,8775,8776,8779,8780,8782,8783,8785],{},[603,8766,8767],{},"Argument"," : supposer ",[674,8770,6557],{}," existe, construire ",[674,8773,8774],{},"paradox(p)"," qui boucle si ",[674,8777,8778],{},"arret(p, p)"," retourne ",[674,8781,1437],{},", termine sinon. Examiner ",[674,8784,6705],{}," → contradiction dans les deux cas.",[911,8787,8788,8791],{},[603,8789,8790],{},"Théorème de Rice"," : toute propriété sémantique non-triviale est indécidable.",[594,8793,7152],{"id":7151},[641,8795,8796,8806],{},[644,8797,8798],{},[647,8799,8800,8803],{},[650,8801,8802],{},"Question",[650,8804,8805],{},"Réponse",[660,8807,8808,8816,8824],{},[647,8809,8810,8813],{},[665,8811,8812],{},"Python peut-il calculer plus que C ?",[665,8814,8815],{},"Non, même classe de fonctions calculables.",[647,8817,8818,8821],{},[665,8819,8820],{},"Peut-on écrire un détecteur de boucles infinies parfait ?",[665,8822,8823],{},"Non — problème de l'arrêt.",[647,8825,8826,8829],{},[665,8827,8828],{},"Un compilateur traduit-il vers du natif ?",[665,8830,8831],{},"Souvent — GCC vers du C compilé en binaire.",[594,8833,7233],{"id":7232},[908,8835,8836,8839,8846],{},[911,8837,8838],{},"Croire qu'un langage plus expressif calcule plus.",[911,8840,8841,8842,8845],{},"Confondre indécidable et difficile — c'est ",[603,8843,8844],{},"impossible",", pas juste lent.",[911,8847,8848],{},"Penser que les analyseurs statiques résolvent le problème de l'arrêt.",[594,8850,8852],{"id":8851},"argument-diagonal-schéma","Argument diagonal (schéma)",[793,8854,8856],{"className":795,"code":8855,"language":797,"meta":798,"style":798},"# Si arret(p, e) existait :\ndef paradox(p):\n    if arret(p, p):\n        while True: pass     # boucle\n    return                   # termine\n\n# paradox(paradox) : contradiction dans les deux cas.\n",[674,8857,8858,8863,8871,8878,8893,8900,8904],{"__ignoreMap":798},[802,8859,8860],{"class":804,"line":805},[802,8861,8862],{"class":829},"# Si arret(p, e) existait :\n",[802,8864,8865,8867,8869],{"class":804,"line":833},[802,8866,943],{"class":819},[802,8868,6632],{"class":946},[802,8870,6635],{"class":812},[802,8872,8873,8875],{"class":804,"line":858},[802,8874,2592],{"class":819},[802,8876,8877],{"class":812}," arret(p, p):\n",[802,8879,8880,8882,8884,8887,8890],{"class":804,"line":993},[802,8881,6650],{"class":819},[802,8883,6653],{"class":808},[802,8885,8886],{"class":812},": ",[802,8888,8889],{"class":819},"pass",[802,8891,8892],{"class":829},"     # boucle\n",[802,8894,8895,8897],{"class":804,"line":1010},[802,8896,1032],{"class":819},[802,8898,8899],{"class":829},"                   # termine\n",[802,8901,8902],{"class":804,"line":1029},[802,8903,1124],{"emptyLinePlaceholder":1123},[802,8905,8906],{"class":804,"line":1147},[802,8907,8908],{"class":829},"# paradox(paradox) : contradiction dans les deux cas.\n",[1513,8910,8911],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":798,"searchDepth":833,"depth":833,"links":8913},[8914,8915,8916,8917,8918],{"id":7086,"depth":833,"text":7087},{"id":7095,"depth":833,"text":7096},{"id":7151,"depth":833,"text":7152},{"id":7232,"depth":833,"text":7233},{"id":8851,"depth":833,"text":8852},"Mémo de révision sur calculabilité, interpréteur\u002Fcompilateur et indécidabilité du problème de l'arrêt.",{},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fprogramme-comme-donnee.memo",[],{"title":8726,"description":8919},"2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee.memo","FqqVIIz5p7mWJ3qu5cM-m4ZsGrSwiqxZyzBABH54jb8",{"id":8927,"title":8928,"bo":8929,"body":8930,"description":10446,"eval":1530,"extension":1531,"labo":1530,"meta":10447,"navigation":1537,"path":10449,"quizzes":10450,"readingTime":805,"seo":10491,"stem":10492,"tp":1530,"__hash__":10493},"coursMemo\u002F2.nsi-tale\u002Ftd-langages-prog\u002Fchapitre.memo.md","Langages et programmation — synthèse",[589,1546,6303,5455,2438],{"type":591,"value":8931,"toc":10441},[8932,8936,8951,8954,8977,9003,9522,9548,9580,9584,9677,9681,9727,10008,10040,10070,10079,10102,10111,10141],[594,8933,8935],{"id":8934},"vue-densemble","Vue d'ensemble",[599,8937,8938,8939,8942,8943,8946,8947,8950],{},"Le chapitre TD est le ",[603,8940,8941],{},"chapitre de maturité"," de l'année. Vous y avez quitté\nla posture de l'élève qui « fait marcher du code » pour celle de\nl'",[603,8944,8945],{},"ingénieur"," qui le produit avec discipline, et de l'",[603,8948,8949],{},"informaticien"," qui\nsait prendre du recul théorique sur ce qu'il fait.",[599,8952,8953],{},"Cinq fils s'y sont tressés :",[599,8955,8956,8959,8960,8963,8964,8967,8968,8971,8972,8976],{},[603,8957,8958],{},"Discipline d'ingénierie (TD01)",". Vous avez vu que faire tourner un\nprogramme ne suffit pas. Il faut reconnaître les ",[603,8961,8962],{},"familles de bugs","\nrécurrentes — typage, effets de bord, hors-bornes, conditionnelles\nnon-exhaustives, comparaisons de flottants — et instrumenter le code par des\n",[603,8965,8966],{},"assertions",", des ",[603,8969,8970],{},"doctests"," et un jeu de tests ",[603,8973,8974],{},[674,8975,1081],{},". La leçon\ncentrale : un code sans tests automatisés est un code qu'on n'ose plus\nmodifier.",[599,8978,8979,8982,8983,1565,8985,8988,8989,8992,8993,8996,8997,8999,9000,9002],{},[603,8980,8981],{},"Modularité (TD02)",". Vous avez appris à découper un programme en\n",[603,8984,1560],{},[603,8986,8987],{},"packages",", à consommer une ",[603,8990,8991],{},"bibliothèque"," via sa\n",[603,8994,8995],{},"documentation"," (",[674,8998,2333],{},", doc en ligne) et à ",[603,9001,1581],{}," vos propres\nmodules — docstring, typage, doctests. Un module bien fait est un module qu'on\npeut redonner à quelqu'un sans le lire avec lui.",[599,9004,9005,9008,9009,7194,9012,9015,9016,9019,9020,9022,9023,9026,9027,9204,9205,9471,9472,9515,9516,9518,9519,9521],{},[603,9006,9007],{},"Récursivité (TD05)",". Vous avez compris la mécanique d'une fonction qui\ns'auto-appelle : ",[603,9010,9011],{},"cas de base",[603,9013,9014],{},"réduction stricte",". La ",[603,9017,9018],{},"pile d'appels","\nmatérialise les appels imbriqués. L'",[603,9021,2461],{}," se fait par ",[603,9024,9025],{},"relation\nde récurrence"," : factorielle linéaire (",[802,9028,9030,9084],{"className":9029},[2781],[802,9031,9033],{"className":9032},[2785],[1698,9034,9035],{"xmlns":2788},[2790,9036,9037,9081],{},[2793,9038,9039,9041,9043,9045,9047,9049,9051,9053,9055,9057,9059,9061,9063,9065,9067,9069,9071,9073,9075,9077,9079],{},[3088,9040,3090],{},[2799,9042,813],{"stretchy":3093},[3088,9044,1410],{},[2799,9046,3098],{"stretchy":3093},[2799,9048,2811],{},[3088,9050,3090],{},[2799,9052,813],{"stretchy":3093},[3088,9054,1410],{},[2799,9056,3165],{},[2796,9058,897],{},[2799,9060,3098],{"stretchy":3093},[2799,9062,3172],{},[3088,9064,3175],{},[2799,9066,813],{"stretchy":3093},[2796,9068,897],{},[2799,9070,3098],{"stretchy":3093},[2799,9072,7702],{},[3088,9074,3175],{},[2799,9076,813],{"stretchy":3093},[3088,9078,1410],{},[2799,9080,3098],{"stretchy":3093},[2840,9082,9083],{"encoding":2842},"T(n) = T(n-1) + O(1) \\Rightarrow\nO(n)",[802,9085,9087,9114,9138,9159,9186],{"className":9086,"ariaHidden":2848},[2847],[802,9088,9090,9093,9096,9099,9102,9105,9108,9111],{"className":9089},[2852],[802,9091],{"className":9092,"style":3111},[2856],[802,9094,3090],{"className":9095,"style":3116},[2861,3115],[802,9097,813],{"className":9098},[3120],[802,9100,1410],{"className":9101},[2861,3115],[802,9103,3098],{"className":9104},[3127],[802,9106],{"className":9107,"style":2866},[2865],[802,9109,2811],{"className":9110},[2870],[802,9112],{"className":9113,"style":2866},[2865],[802,9115,9117,9120,9123,9126,9129,9132,9135],{"className":9116},[2852],[802,9118],{"className":9119,"style":3111},[2856],[802,9121,3090],{"className":9122,"style":3116},[2861,3115],[802,9124,813],{"className":9125},[3120],[802,9127,1410],{"className":9128},[2861,3115],[802,9130],{"className":9131,"style":2887},[2865],[802,9133,3165],{"className":9134},[2891],[802,9136],{"className":9137,"style":2887},[2865],[802,9139,9141,9144,9147,9150,9153,9156],{"className":9140},[2852],[802,9142],{"className":9143,"style":3111},[2856],[802,9145,897],{"className":9146},[2861],[802,9148,3098],{"className":9149},[3127],[802,9151],{"className":9152,"style":2887},[2865],[802,9154,3172],{"className":9155},[2891],[802,9157],{"className":9158,"style":2887},[2865],[802,9160,9162,9165,9168,9171,9174,9177,9180,9183],{"className":9161},[2852],[802,9163],{"className":9164,"style":3111},[2856],[802,9166,3175],{"className":9167,"style":3296},[2861,3115],[802,9169,813],{"className":9170},[3120],[802,9172,897],{"className":9173},[2861],[802,9175,3098],{"className":9176},[3127],[802,9178],{"className":9179,"style":2866},[2865],[802,9181,7702],{"className":9182},[2870],[802,9184],{"className":9185,"style":2866},[2865],[802,9187,9189,9192,9195,9198,9201],{"className":9188},[2852],[802,9190],{"className":9191,"style":3111},[2856],[802,9193,3175],{"className":9194,"style":3296},[2861,3115],[802,9196,813],{"className":9197},[3120],[802,9199,1410],{"className":9200},[2861,3115],[802,9202,3098],{"className":9203},[3127],"), Fibonacci naïf exponentiel (",[802,9206,9208,9280],{"className":9207},[2781],[802,9209,9211],{"className":9210},[2785],[1698,9212,9213],{"xmlns":2788},[2790,9214,9215,9277],{},[2793,9216,9217,9219,9221,9223,9225,9227,9229,9231,9233,9235,9237,9239,9241,9243,9245,9247,9249,9251,9253,9255,9257,9259,9261,9263,9265,9267,9269,9275],{},[3088,9218,3090],{},[2799,9220,813],{"stretchy":3093},[3088,9222,1410],{},[2799,9224,3098],{"stretchy":3093},[2799,9226,2811],{},[3088,9228,3090],{},[2799,9230,813],{"stretchy":3093},[3088,9232,1410],{},[2799,9234,3165],{},[2796,9236,897],{},[2799,9238,3098],{"stretchy":3093},[2799,9240,3172],{},[3088,9242,3090],{},[2799,9244,813],{"stretchy":3093},[3088,9246,1410],{},[2799,9248,3165],{},[2796,9250,1292],{},[2799,9252,3098],{"stretchy":3093},[2799,9254,3172],{},[3088,9256,3175],{},[2799,9258,813],{"stretchy":3093},[2796,9260,897],{},[2799,9262,3098],{"stretchy":3093},[2799,9264,7702],{},[3088,9266,3175],{},[2799,9268,813],{"stretchy":3093},[4506,9270,9271,9273],{},[3088,9272,4510],{},[3088,9274,1410],{},[2799,9276,3098],{"stretchy":3093},[2840,9278,9279],{"encoding":2842},"T(n) = T(n-1) + T(n-2) + O(1) \\Rightarrow\nO(\\varphi^n)",[802,9281,9283,9310,9334,9355,9379,9400,9427],{"className":9282,"ariaHidden":2848},[2847],[802,9284,9286,9289,9292,9295,9298,9301,9304,9307],{"className":9285},[2852],[802,9287],{"className":9288,"style":3111},[2856],[802,9290,3090],{"className":9291,"style":3116},[2861,3115],[802,9293,813],{"className":9294},[3120],[802,9296,1410],{"className":9297},[2861,3115],[802,9299,3098],{"className":9300},[3127],[802,9302],{"className":9303,"style":2866},[2865],[802,9305,2811],{"className":9306},[2870],[802,9308],{"className":9309,"style":2866},[2865],[802,9311,9313,9316,9319,9322,9325,9328,9331],{"className":9312},[2852],[802,9314],{"className":9315,"style":3111},[2856],[802,9317,3090],{"className":9318,"style":3116},[2861,3115],[802,9320,813],{"className":9321},[3120],[802,9323,1410],{"className":9324},[2861,3115],[802,9326],{"className":9327,"style":2887},[2865],[802,9329,3165],{"className":9330},[2891],[802,9332],{"className":9333,"style":2887},[2865],[802,9335,9337,9340,9343,9346,9349,9352],{"className":9336},[2852],[802,9338],{"className":9339,"style":3111},[2856],[802,9341,897],{"className":9342},[2861],[802,9344,3098],{"className":9345},[3127],[802,9347],{"className":9348,"style":2887},[2865],[802,9350,3172],{"className":9351},[2891],[802,9353],{"className":9354,"style":2887},[2865],[802,9356,9358,9361,9364,9367,9370,9373,9376],{"className":9357},[2852],[802,9359],{"className":9360,"style":3111},[2856],[802,9362,3090],{"className":9363,"style":3116},[2861,3115],[802,9365,813],{"className":9366},[3120],[802,9368,1410],{"className":9369},[2861,3115],[802,9371],{"className":9372,"style":2887},[2865],[802,9374,3165],{"className":9375},[2891],[802,9377],{"className":9378,"style":2887},[2865],[802,9380,9382,9385,9388,9391,9394,9397],{"className":9381},[2852],[802,9383],{"className":9384,"style":3111},[2856],[802,9386,1292],{"className":9387},[2861],[802,9389,3098],{"className":9390},[3127],[802,9392],{"className":9393,"style":2887},[2865],[802,9395,3172],{"className":9396},[2891],[802,9398],{"className":9399,"style":2887},[2865],[802,9401,9403,9406,9409,9412,9415,9418,9421,9424],{"className":9402},[2852],[802,9404],{"className":9405,"style":3111},[2856],[802,9407,3175],{"className":9408,"style":3296},[2861,3115],[802,9410,813],{"className":9411},[3120],[802,9413,897],{"className":9414},[2861],[802,9416,3098],{"className":9417},[3127],[802,9419],{"className":9420,"style":2866},[2865],[802,9422,7702],{"className":9423},[2870],[802,9425],{"className":9426,"style":2866},[2865],[802,9428,9430,9433,9436,9439,9468],{"className":9429},[2852],[802,9431],{"className":9432,"style":3111},[2856],[802,9434,3175],{"className":9435,"style":3296},[2861,3115],[802,9437,813],{"className":9438},[3120],[802,9440,9442,9445],{"className":9441},[2861],[802,9443,4510],{"className":9444},[2861,3115],[802,9446,9448],{"className":9447},[3803],[802,9449,9451],{"className":9450},[3807],[802,9452,9454],{"className":9453},[3812],[802,9455,9457],{"className":9456,"style":4578},[3816],[802,9458,9459,9462],{"style":4581},[802,9460],{"className":9461,"style":3825},[3824],[802,9463,9465],{"className":9464},[3829,3830,3831,3832],[802,9466,1410],{"className":9467},[2861,3115,3832],[802,9469,3098],{"className":9470},[3127],"), Fibonacci mémoïsé linéaire (",[802,9473,9475,9494],{"className":9474},[2781],[802,9476,9478],{"className":9477},[2785],[1698,9479,9480],{"xmlns":2788},[2790,9481,9482,9492],{},[2793,9483,9484,9486,9488,9490],{},[3088,9485,3175],{},[2799,9487,813],{"stretchy":3093},[3088,9489,1410],{},[2799,9491,3098],{"stretchy":3093},[2840,9493,4972],{"encoding":2842},[802,9495,9497],{"className":9496,"ariaHidden":2848},[2847],[802,9498,9500,9503,9506,9509,9512],{"className":9499},[2852],[802,9501],{"className":9502,"style":3111},[2856],[802,9504,3175],{"className":9505,"style":3296},[2861,3115],[802,9507,813],{"className":9508},[3120],[802,9510,1410],{"className":9511},[2861,3115],[802,9513,3098],{"className":9514},[3127],"). La ",[603,9517,4998],{}," —\navec un dictionnaire manuel ou le décorateur ",[674,9520,5209],{}," — transforme une\nrécursion explosive en récursion efficace.",[599,9523,9524,9527,9528,9530,9531,9533,9534,1906,9536,9538,9539,9541,9542,9544,9545,9547],{},[603,9525,9526],{},"Paradigmes (TD04)",". Vous avez vu le même problème — la somme d'une liste\n— résolu en ",[603,9529,5478],{}," (boucle et accumulateur), ",[603,9532,5482],{},"\n(",[674,9535,6191],{},[674,9537,5869],{},") et ",[603,9540,5510],{}," (classe ",[674,9543,6123],{},"). Un paradigme n'est pas un\nlangage : Python permet les trois. Le choix dépend du problème — pipeline\nde données → fonctionnel, simulation → impératif, modélisation de domaine →\nobjet — et on ",[603,9546,6224],{}," en pratique.",[599,9549,9550,9553,9554,9556,9557,9560,9561,9564,9565,9568,9569,9572,9573,9575,9576,9579],{},[603,9551,9552],{},"Programme comme donnée et indécidabilité (TD03)",". Vous avez vu que votre\ncode Python est une ",[603,9555,6433],{}," pour CPython (qui est lui-même un\nprogramme compilé). La calculabilité ne dépend pas du langage\n(",[603,9558,9559],{},"thèse de Church-Turing",") — un langage plus expressif n'est pas plus puissant.\nSurtout, vous avez vu la ",[603,9562,9563],{},"preuve par auto-référence"," que le problème de\nl'arrêt est ",[603,9566,9567],{},"indécidable"," : on construit ",[674,9570,9571],{},"paradox(p) = if arret(p,p) then loop() else stop()",", et ",[674,9574,6705],{}," mène à contradiction dans tous les\ncas. C'est une limite ",[603,9577,9578],{},"mathématique",", pas technique.",[594,9581,9583],{"id":9582},"carte-des-notions","Carte des notions",[641,9585,9586,9602],{},[644,9587,9588],{},[647,9589,9590,9593,9596,9599],{},[650,9591,9592],{},"Cours",[650,9594,9595],{},"Item BO",[650,9597,9598],{},"Notions-clés",[650,9600,9601],{},"Dépend de",[660,9603,9604,9622,9638,9651,9664],{},[647,9605,9606,9609,9611,9619],{},[665,9607,9608],{},"1. Mise au point",[665,9610,589],{},[665,9612,9613,9614,9616,9617],{},"bugs typiques, ",[674,9615,6982],{},", doctest, ",[674,9618,1081],{},[665,9620,9621],{},"PG (assertions, spec)",[647,9623,9624,9627,9629,9635],{},[665,9625,9626],{},"2. Modularité",[665,9628,1546],{},[665,9630,9631,9632,9634],{},"module, package, API, ",[674,9633,1222],{},", doc",[665,9636,9637],{},"PG (fonctions)",[647,9639,9640,9643,9645,9648],{},[665,9641,9642],{},"3. Récursivité",[665,9644,2438],{},[665,9646,9647],{},"cas de base, pile d'appels, mémoïsation",[665,9649,9650],{},"PH (complexité)",[647,9652,9653,9656,9658,9661],{},[665,9654,9655],{},"4. Paradigmes",[665,9657,5455],{},[665,9659,9660],{},"impératif, fonctionnel, objet",[665,9662,9663],{},"TA (OO)",[647,9665,9666,9669,9671,9674],{},[665,9667,9668],{},"5. Programme = donnée",[665,9670,6303],{},[665,9672,9673],{},"interpréteur, calculabilité, arrêt",[665,9675,9676],{},"tout le chapitre",[594,9678,9680],{"id":9679},"auto-évaluation","Auto-évaluation",[895,9682,9684,9695],{"correct":1292,"slug":9683},"td-langages-prog-1-q1",[900,9685,9686],{"v-slot:question":798},[599,9687,9688,9689,9691,9692,9694],{},"Pourquoi ",[674,9690,770],{}," renvoie-t-il ",[674,9693,6580],{}," en Python ?",[900,9696,9697],{"v-slot:choices":798},[908,9698,9699,9702,9708,9720],{},[911,9700,9701],{},"Python a un bug bien connu sur l'addition flottante.",[911,9703,9704,9705,9707],{},"L'opérateur ",[674,9706,1259],{}," ne fonctionne pas avec les flottants.",[911,9709,9710,9711,677,9713,677,9716,9719],{},"Les flottants sont stockés en binaire et ",[674,9712,816],{},[674,9714,9715],{},"0.2",[674,9717,9718],{},"0.3"," n'ont pas de représentation exacte.",[911,9721,9722,9723,9726],{},"Il faudrait utiliser ",[674,9724,9725],{},"==="," comme en JavaScript.",[895,9728,9730,9739],{"correct":897,"slug":9729},"td-langages-prog-1-q2",[900,9731,9732],{"v-slot:question":798},[599,9733,9734,9735,9738],{},"Quelle est la complexité de ",[674,9736,9737],{},"fib_naif(n)"," (Fibonacci récursif sans mémoïsation) ?",[900,9740,9741],{"v-slot:choices":798},[908,9742,9743,9788,9865,9943],{},[911,9744,9745],{},[802,9746,9748,9767],{"className":9747},[2781],[802,9749,9751],{"className":9750},[2785],[1698,9752,9753],{"xmlns":2788},[2790,9754,9755,9765],{},[2793,9756,9757,9759,9761,9763],{},[3088,9758,3175],{},[2799,9760,813],{"stretchy":3093},[3088,9762,1410],{},[2799,9764,3098],{"stretchy":3093},[2840,9766,4972],{"encoding":2842},[802,9768,9770],{"className":9769,"ariaHidden":2848},[2847],[802,9771,9773,9776,9779,9782,9785],{"className":9772},[2852],[802,9774],{"className":9775,"style":3111},[2856],[802,9777,3175],{"className":9778,"style":3296},[2861,3115],[802,9780,813],{"className":9781},[3120],[802,9783,1410],{"className":9784},[2861,3115],[802,9786,3098],{"className":9787},[3127],[911,9789,9790,9864],{},[802,9791,9793,9817],{"className":9792},[2781],[802,9794,9796],{"className":9795},[2785],[1698,9797,9798],{"xmlns":2788},[2790,9799,9800,9814],{},[2793,9801,9802,9804,9806,9812],{},[3088,9803,3175],{},[2799,9805,813],{"stretchy":3093},[4506,9807,9808,9810],{},[3088,9809,4510],{},[3088,9811,1410],{},[2799,9813,3098],{"stretchy":3093},[2840,9815,9816],{"encoding":2842},"O(\\varphi^n)",[802,9818,9820],{"className":9819,"ariaHidden":2848},[2847],[802,9821,9823,9826,9829,9832,9861],{"className":9822},[2852],[802,9824],{"className":9825,"style":3111},[2856],[802,9827,3175],{"className":9828,"style":3296},[2861,3115],[802,9830,813],{"className":9831},[3120],[802,9833,9835,9838],{"className":9834},[2861],[802,9836,4510],{"className":9837},[2861,3115],[802,9839,9841],{"className":9840},[3803],[802,9842,9844],{"className":9843},[3807],[802,9845,9847],{"className":9846},[3812],[802,9848,9850],{"className":9849,"style":4578},[3816],[802,9851,9852,9855],{"style":4581},[802,9853],{"className":9854,"style":3825},[3824],[802,9856,9858],{"className":9857},[3829,3830,3831,3832],[802,9859,1410],{"className":9860},[2861,3115,3832],[802,9862,3098],{"className":9863},[3127],", exponentielle",[911,9866,9867],{},[802,9868,9870,9894],{"className":9869},[2781],[802,9871,9873],{"className":9872},[2785],[1698,9874,9875],{"xmlns":2788},[2790,9876,9877,9891],{},[2793,9878,9879,9881,9883,9889],{},[3088,9880,3175],{},[2799,9882,813],{"stretchy":3093},[4506,9884,9885,9887],{},[3088,9886,1410],{},[2796,9888,1292],{},[2799,9890,3098],{"stretchy":3093},[2840,9892,9893],{"encoding":2842},"O(n^2)",[802,9895,9897],{"className":9896,"ariaHidden":2848},[2847],[802,9898,9900,9904,9907,9910,9940],{"className":9899},[2852],[802,9901],{"className":9902,"style":9903},[2856],"height:1.0641em;vertical-align:-0.25em;",[802,9905,3175],{"className":9906,"style":3296},[2861,3115],[802,9908,813],{"className":9909},[3120],[802,9911,9913,9916],{"className":9912},[2861],[802,9914,1410],{"className":9915},[2861,3115],[802,9917,9919],{"className":9918},[3803],[802,9920,9922],{"className":9921},[3807],[802,9923,9925],{"className":9924},[3812],[802,9926,9929],{"className":9927,"style":9928},[3816],"height:0.8141em;",[802,9930,9931,9934],{"style":4581},[802,9932],{"className":9933,"style":3825},[3824],[802,9935,9937],{"className":9936},[3829,3830,3831,3832],[802,9938,1292],{"className":9939},[2861,3832],[802,9941,3098],{"className":9942},[3127],[911,9944,9945],{},[802,9946,9948,9974],{"className":9947},[2781],[802,9949,9951],{"className":9950},[2785],[1698,9952,9953],{"xmlns":2788},[2790,9954,9955,9971],{},[2793,9956,9957,9959,9961,9964,9967,9969],{},[3088,9958,3175],{},[2799,9960,813],{"stretchy":3093},[3088,9962,9963],{},"log",[2799,9965,9966],{},"⁡",[3088,9968,1410],{},[2799,9970,3098],{"stretchy":3093},[2840,9972,9973],{"encoding":2842},"O(\\log n)",[802,9975,9977],{"className":9976,"ariaHidden":2848},[2847],[802,9978,9980,9983,9986,9989,9998,10002,10005],{"className":9979},[2852],[802,9981],{"className":9982,"style":3111},[2856],[802,9984,3175],{"className":9985,"style":3296},[2861,3115],[802,9987,813],{"className":9988},[3120],[802,9990,9993,9994],{"className":9991},[9992],"mop","lo",[802,9995,9997],{"style":9996},"margin-right:0.0139em;","g",[802,9999],{"className":10000,"style":10001},[2865],"margin-right:0.1667em;",[802,10003,1410],{"className":10004},[2861,3115],[802,10006,3098],{"className":10007},[3127],[895,10009,10011,10016],{"correct":1292,"slug":10010},"td-langages-prog-1-q3",[900,10012,10013],{"v-slot:question":798},[599,10014,10015],{},"Que doit obligatoirement contenir toute fonction récursive bien formée ?",[900,10017,10018],{"v-slot:choices":798},[908,10019,10020,10026,10031,10034],{},[911,10021,10022,10023,614],{},"Un appel à ",[674,10024,10025],{},"sys.setrecursionlimit",[911,10027,10028,10029,614],{},"Un décorateur ",[674,10030,5209],{},[911,10032,10033],{},"Au moins un cas de base et un appel récursif sur une entrée strictement plus petite.",[911,10035,10036,10037,614],{},"Une boucle ",[674,10038,10039],{},"while",[895,10041,10044,10052],{"correct":10042,"slug":10043},"0,1,2","td-langages-prog-1-q4",[900,10045,10046],{"v-slot:question":798},[599,10047,10048,10049,10051],{},"Lesquels de ces énoncés caractérisent une ",[603,10050,8489],{}," (paradigme fonctionnel) ?\n(plusieurs réponses)",[900,10053,10054],{"v-slot:choices":798},[908,10055,10056,10059,10062,10065],{},[911,10057,10058],{},"Elle n'a pas d'effet de bord.",[911,10060,10061],{},"Le même argument donne toujours le même résultat.",[911,10063,10064],{},"Elle ne modifie pas ses arguments.",[911,10066,10067,10068,614],{},"Elle doit être définie avec ",[674,10069,8533],{},[10071,10072,10074],"self-eval-free-text",{"answer":6695,"case-sensitive":3093,"slug":10073},"td-langages-prog-1-q5",[900,10075,10076],{"v-slot:question":798},[599,10077,10078],{},"Quel nom porte la fonction hypothétique dont l'existence mène à la contradiction dans la preuve d'indécidabilité du problème de l'arrêt ?",[895,10080,10082,10087],{"correct":1292,"slug":10081},"td-langages-prog-1-q6",[900,10083,10084],{"v-slot:question":798},[599,10085,10086],{},"Le problème de l'arrêt est-il :",[900,10088,10089],{"v-slot:choices":798},[908,10090,10091,10094,10096,10099],{},[911,10092,10093],{},"décidable",[911,10095,9567],{},[911,10097,10098],{},"partiellement décidable seulement pour des programmes courts",[911,10100,10101],{},"indéterminé (la question est mal posée)",[10071,10103,10106],{"answer":10104,"case-sensitive":3093,"slug":10105},"church-turing","td-langages-prog-1-q7",[900,10107,10108],{"v-slot:question":798},[599,10109,10110],{},"Quel est le nom de la thèse selon laquelle tous les langages Turing-complets calculent les mêmes fonctions ?",[10112,10113,10115,10122],"self-eval-ordering",{"slug":10114},"td-langages-prog-1-q8",[900,10116,10117],{"v-slot:question":798},[599,10118,10119,10120,6712],{},"Ordonnez les étapes de l'exécution de ",[674,10121,6346],{},[900,10123,10124],{"v-slot:items":798},[908,10125,10126,10129,10135,10138],{},[911,10127,10128],{},"L'OS lance l'exécutable CPython",[911,10130,10131,10132,10134],{},"CPython lit le fichier ",[674,10133,6354],{}," comme texte",[911,10136,10137],{},"CPython parse le source en arbre syntaxique",[911,10139,10140],{},"CPython exécute le programme représenté par cet arbre",[10112,10142,10144,10264],{"slug":10143},"td-langages-prog-1-q9",[900,10145,10146],{"v-slot:question":798},[599,10147,10148,10149,10152,10153,10156,10157,10160,10161,10189,10190,10263],{},"Pour calculer ",[674,10150,10151],{},"fib(40)",", ordonnez ces stratégies de la ",[603,10154,10155],{},"plus efficace en mémoire"," à la ",[603,10158,10159],{},"plus coûteuse",". Repère : l'itératif maintient deux variables, le mémoïsé stocke un cache de taille ",[802,10162,10164,10177],{"className":10163},[2781],[802,10165,10167],{"className":10166},[2785],[1698,10168,10169],{"xmlns":2788},[2790,10170,10171,10175],{},[2793,10172,10173],{},[3088,10174,1410],{},[2840,10176,1410],{"encoding":2842},[802,10178,10180],{"className":10179,"ariaHidden":2848},[2847],[802,10181,10183,10186],{"className":10182},[2852],[802,10184],{"className":10185,"style":3525},[2856],[802,10187,1410],{"className":10188},[2861,3115],", le naïf empile ",[802,10191,10193,10216],{"className":10192},[2781],[802,10194,10196],{"className":10195},[2785],[1698,10197,10198],{"xmlns":2788},[2790,10199,10200,10214],{},[2793,10201,10202,10204,10206,10212],{},[3088,10203,3175],{},[2799,10205,813],{"stretchy":3093},[4506,10207,10208,10210],{},[3088,10209,4510],{},[3088,10211,1410],{},[2799,10213,3098],{"stretchy":3093},[2840,10215,9816],{"encoding":2842},[802,10217,10219],{"className":10218,"ariaHidden":2848},[2847],[802,10220,10222,10225,10228,10231,10260],{"className":10221},[2852],[802,10223],{"className":10224,"style":3111},[2856],[802,10226,3175],{"className":10227,"style":3296},[2861,3115],[802,10229,813],{"className":10230},[3120],[802,10232,10234,10237],{"className":10233},[2861],[802,10235,4510],{"className":10236},[2861,3115],[802,10238,10240],{"className":10239},[3803],[802,10241,10243],{"className":10242},[3807],[802,10244,10246],{"className":10245},[3812],[802,10247,10249],{"className":10248,"style":4578},[3816],[802,10250,10251,10254],{"style":4581},[802,10252],{"className":10253,"style":3825},[3824],[802,10255,10257],{"className":10256},[3829,3830,3831,3832],[802,10258,1410],{"className":10259},[2861,3115,3832],[802,10261,3098],{"className":10262},[3127]," appels imbriqués.",[900,10265,10266],{"v-slot:items":798},[908,10267,10268,10314,10365],{},[911,10269,10270,10271,3098],{},"Fibonacci itératif avec deux variables (mémoire ",[802,10272,10274,10293],{"className":10273},[2781],[802,10275,10277],{"className":10276},[2785],[1698,10278,10279],{"xmlns":2788},[2790,10280,10281,10291],{},[2793,10282,10283,10285,10287,10289],{},[3088,10284,3175],{},[2799,10286,813],{"stretchy":3093},[2796,10288,897],{},[2799,10290,3098],{"stretchy":3093},[2840,10292,5026],{"encoding":2842},[802,10294,10296],{"className":10295,"ariaHidden":2848},[2847],[802,10297,10299,10302,10305,10308,10311],{"className":10298},[2852],[802,10300],{"className":10301,"style":3111},[2856],[802,10303,3175],{"className":10304,"style":3296},[2861,3115],[802,10306,813],{"className":10307},[3120],[802,10309,897],{"className":10310},[2861],[802,10312,3098],{"className":10313},[3127],[911,10315,10316,10317,10320,10321,10364],{},"Fibonacci mémoïsé via ",[674,10318,10319],{},"@lru_cache(maxsize=None)"," (mémoire ",[802,10322,10324,10343],{"className":10323},[2781],[802,10325,10327],{"className":10326},[2785],[1698,10328,10329],{"xmlns":2788},[2790,10330,10331,10341],{},[2793,10332,10333,10335,10337,10339],{},[3088,10334,3175],{},[2799,10336,813],{"stretchy":3093},[3088,10338,1410],{},[2799,10340,3098],{"stretchy":3093},[2840,10342,4972],{"encoding":2842},[802,10344,10346],{"className":10345,"ariaHidden":2848},[2847],[802,10347,10349,10352,10355,10358,10361],{"className":10348},[2852],[802,10350],{"className":10351,"style":3111},[2856],[802,10353,3175],{"className":10354,"style":3296},[2861,3115],[802,10356,813],{"className":10357},[3120],[802,10359,1410],{"className":10360},[2861,3115],[802,10362,3098],{"className":10363},[3127]," pour le cache)",[911,10366,10367,10368,3098],{},"Fibonacci récursif naïf (pile d'appels exponentielle, temps ",[802,10369,10371,10394],{"className":10370},[2781],[802,10372,10374],{"className":10373},[2785],[1698,10375,10376],{"xmlns":2788},[2790,10377,10378,10392],{},[2793,10379,10380,10382,10384,10390],{},[3088,10381,3175],{},[2799,10383,813],{"stretchy":3093},[4506,10385,10386,10388],{},[3088,10387,4510],{},[3088,10389,1410],{},[2799,10391,3098],{"stretchy":3093},[2840,10393,9816],{"encoding":2842},[802,10395,10397],{"className":10396,"ariaHidden":2848},[2847],[802,10398,10400,10403,10406,10409,10438],{"className":10399},[2852],[802,10401],{"className":10402,"style":3111},[2856],[802,10404,3175],{"className":10405,"style":3296},[2861,3115],[802,10407,813],{"className":10408},[3120],[802,10410,10412,10415],{"className":10411},[2861],[802,10413,4510],{"className":10414},[2861,3115],[802,10416,10418],{"className":10417},[3803],[802,10419,10421],{"className":10420},[3807],[802,10422,10424],{"className":10423},[3812],[802,10425,10427],{"className":10426,"style":4578},[3816],[802,10428,10429,10432],{"style":4581},[802,10430],{"className":10431,"style":3825},[3824],[802,10433,10435],{"className":10434},[3829,3830,3831,3832],[802,10436,1410],{"className":10437},[2861,3115,3832],[802,10439,3098],{"className":10440},[3127],{"title":798,"searchDepth":833,"depth":833,"links":10442},[10443,10444,10445],{"id":8934,"depth":833,"text":8935},{"id":9582,"depth":833,"text":9583},{"id":9679,"depth":833,"text":9680},"Vue d'ensemble du chapitre TD — points-clés et auto-évaluation finale.",{"self_eval_slug":10448},"nsi-tale-td-langages-prog","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fchapitre.memo",[10451,10457,10464,10469,10473,10477,10479,10480,10485],{"slug":9683,"kind":1535,"question":10452,"choices":10453,"correct":1292,"multi":1537,"explanation":798},"Pourquoi 0.1 + 0.2 == 0.3 renvoie-t-il False en Python ?",[9701,10454,10455,10456],"L'opérateur == ne fonctionne pas avec les flottants.","Les flottants sont stockés en binaire et 0.1, 0.2, 0.3 n'ont pas de représentation exacte.","Il faudrait utiliser === comme en JavaScript.",{"slug":9729,"kind":1535,"question":10458,"choices":10459,"correct":897,"multi":1537,"explanation":798},"Quelle est la complexité de fib_naif(n) (Fibonacci récursif sans mémoïsation) ?",[10460,10461,10462,10463],"O(n)O(n)O(n)","O(φn)O(\\varphi^n)O(φn), exponentielle","O(n2)O(n^2)O(n2)","O(log⁡n)O(\\log n)O(logn)",{"slug":10010,"kind":1535,"question":10015,"choices":10465,"correct":1292,"multi":1537,"explanation":798},[10466,10467,10033,10468],"Un appel à sys.setrecursionlimit.","Un décorateur @lru_cache.","Une boucle while.",{"slug":10043,"kind":1535,"question":10470,"choices":10471,"correct":10042,"multi":1123,"explanation":798},"Lesquels de ces énoncés caractérisent une fonction pure (paradigme fonctionnel) ?\n(plusieurs réponses)",[10058,10061,10064,10472],"Elle doit être définie avec lambda.",{"slug":10073,"kind":10474,"question":10078,"answer":6695,"caseSensitive":1537,"tolerance":10475,"inputType":10476,"explanation":798},"free_text",0,"string",{"slug":10081,"kind":1535,"question":10086,"choices":10478,"correct":1292,"multi":1537,"explanation":798},[10093,9567,10098,10101],{"slug":10105,"kind":10474,"question":10110,"answer":10104,"caseSensitive":1537,"tolerance":10475,"inputType":10476,"explanation":798},{"slug":10114,"kind":10481,"question":10482,"items":10483,"explanation":798},"ordering","Ordonnez les étapes de l'exécution de python mon_script.py :",[10128,10484,10137,10140],"CPython lit le fichier mon_script.py comme texte",{"slug":10143,"kind":10481,"question":10486,"items":10487,"explanation":798},"Pour calculer fib(40), ordonnez ces stratégies de la plus efficace en mémoire à la plus coûteuse. Repère : l'itératif maintient deux variables, le mémoïsé stocke un cache de taille nnn, le naïf empile O(φn)O(\\varphi^n)O(φn) appels imbriqués.",[10488,10489,10490],"Fibonacci itératif avec deux variables (mémoire O(1)O(1)O(1))","Fibonacci mémoïsé via @lru_cache(maxsize=None) (mémoire O(n)O(n)O(n) pour le cache)","Fibonacci récursif naïf (pile d'appels exponentielle, temps O(φn)O(\\varphi^n)O(φn))",{"title":8928,"description":10446},"2.nsi-tale\u002Ftd-langages-prog\u002Fchapitre.memo","V4uqZaCz1HQVEIdI7XuBeOtaT4YbrcTIT-5IIx3a9o8",1788035585352]