{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Python - Les boucles\n\n\n\n### Compétences attendues\n    - Savoir programmer en Python : fonctions d'entrée et de sortie, boucles \\pyv{if}, \\pyv{for}, \\pyv{while}.\n    \n### Liste des commandes Python exigibles aux concours\n    - Comparaison et connecteurs logiques pour les booléens : ==, >, <, >=, <=, !=, True, False, and, or, not\n    - Programmation : range, for, while,..."},{"metadata":{},"cell_type":"markdown","source":"## Les boucles for\n### Présentation\n##### Définition:\nLa commande range énumère des entiers en progression arithmétique.\n\n    - range(n) énumère les entiers successifs de 0 à n-1.    \n    - range(n,m) énumère les entiers successifs de n à m-1 (avec n<m).    \n    - range(n,m,r) énumère les entiers en progression arithmétique de raison r (entier positif ou négatif, appelé le pas), \n    de n inclu à m exclu.\n\nRemarques:\n\n    - La commande range ne provoque pas d'affichage.    \n    - On prendra garde à deux choses : l'énumération s'arrête avant l'entier pris comme extrémité à droite, et par défaut, \n    elle commence à 0 et non à 1. \n\nPar exemple :\n\n    - range(7) énumère les entiers 0, 1, 2, 3, 4, 5, 6.    \n    - range(3,9) énumère les entiers 3, 4, 5, 6, 7, 8.    \n    - range(-2,8,2) énumère les entiers -2, 0, 2, 4, 6.    \n    - range(4,0,-1) énumère les entiers 4, 3, 2, 1.\n\n\n###### Définition:\nPour répéter un bloc d'instructions un nombre déterminé de fois, on utilise une boucle for. \n\nLa syntaxe est la suivante :"},{"metadata":{"trusted":false},"cell_type":"code","source":"for variable in range(début, fin,pas) :\n    instructions","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"La variable parcourt dans l'ordre les entiers de début inclus à fin exclu en suivant le pas régulier et, à chaque étape, les instructions sont effectuées.\n\n\nRemarques:\n\n    - Comme pour les instructions conditionnelles, il faut faire attention aux deux points après le range et à \n    l'indentation!\n    - Pour le range, on utilisera lorsque c'est possible les expressions simplifiées range(n,m) ou range(n).\n\n\n#### Exemple:\nTaper dans l'éditeur de texte le script suivant puis l'exécuter. Que calcule-t-il ?"},{"metadata":{"trusted":false},"cell_type":"code","source":"p = 1\nfor k in range(1,11) :\n    p = p*k\nprint(p)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Le script calcule $10!$."},{"metadata":{},"cell_type":"markdown","source":"    - Une spécificité du langage Python est qu'il est possible d'itérer sur de nombreux objets. On peut remplacer \n    l'énumérateur range par une chaîne de caractères ou un tableau. \n           - Par exemple, avec une chaîne de caractère:"},{"metadata":{"trusted":false},"cell_type":"code","source":"for car in \"ma chaine\":\n  print(car)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"On obtient l'affichage successif de chaque lettre de cette chaine de caractère.\n        \n            - Si la variable T contient un tableau, la boucle"},{"metadata":{"trusted":false},"cell_type":"code","source":"for variable in T :\n    instructions","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"            répète les instructions indentées, une fois pour chaque élément du tableau."},{"metadata":{},"cell_type":"markdown","source":"### Les boucles classiques et fondamentales\n\n#### Exercice II.1 (Suite récurrente simple)\nSoit $\\left(u_n\\right)_{n \\in \\mathbb{N}}$ une suite définie par $u_0=\\frac12$ et pour tout $n \\in \\mathbb{N}$, $u_{n+1}=\\frac{2u_n}{u_n+1}$.\n\n   1. Définir une fonction suite qui, à un entier naturel $n$ en entrée, renvoie la valeur de $u_n$."},{"metadata":{"trusted":false},"cell_type":"code","source":"def ... :\n    u = ...\n    for k in ... :\n        ...\n    return ...\nu(10)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"   2. De manière empirique, que diriez vous de la limite éventuelle de cette suite?"},{"metadata":{},"cell_type":"raw","source":"        "},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.2 (Produit simple)\nOn définit la suite $\\left(u_n\\right)_{n \\in \\mathbb{N}^*}$ par $\\forall n \\in \\mathbb{N}^*$, $\\displaystyle u_n=\\prod_{k=1}^n\\left(1+\\frac{1}{k}\\right)$.\n\n   1.a Compléter le programme ci-dessous qui prend en argument $n$ et renvoie $u_n$.\n   Que conjecturez-vous?"},{"metadata":{"trusted":false},"cell_type":"code","source":"n = int(input('Donner n : '))\nP = ...\nfor i in ... :\n    ...\nprint(...)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1.b Démontrer votre conjecture."},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"2. Mêmes questions avec la suite $\\left(v_n\\right)_{n \\in \\mathbb{N}^*}$ par $\\forall n \\in \\mathbb{N}^*$, $\\displaystyle v_n=\\prod_{k=1}^n\\left(1-\\frac{1}{k^2}\\right)$."},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.3 (Suite récurrente double)\nSoit $\\left(F_n\\right)_{n \\in \\mathbb{N}}$ une suite définie par $F_0=0$, $F_1=1$ et pour tout $n \\in \\mathbb{N}$, $$F_{n+2}=F_{n+1}+F_n.$$\n\n1. Définir une fonction Fib qui, à un entier naturel $n\\geq 2$ en entrée, renvoie la valeur de $F_n$."},{"metadata":{"trusted":false},"cell_type":"code","source":"def Fib... :\n   u = ...\n   v = ...\n   for k in ... :\n     ...\n     ...\n   return w","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Modifier votre fonction afin qu'elle renvoie le quotient $\\frac{F_{n+1}}{F_n}$ pour $n\\geq 1$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Une conjecture sur sa limite éventuelle?"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.4:\n###### Méthode 1:\n1. En vous aidant de l'exemple précédent, écrire une fonction facto qui prend un entier naturel $n$ en argument et renvoie $n!$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. En utilisant la formule explicite des coefficients binomiaux, en déduire une fonction binom1 qui prend en argument deux entiers $p$ et $n$ et renvoie $\\binom{n}{p}$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"3. Tester votre programme. Que pouvez vous conclure sur son efficacité?"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"###### Méthode 2:\n1. Justifier que pour $p, n \\in \\mathbb{N}^*$ avec $p \\leqslant n$: $\\displaystyle \\binom{n}{p}=\\prod_{i=1}^p \\frac{n-p+i}{i}$."},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"2. Compléter le programme suivant permettant le calcul de $\\binom{n}{p}$."},{"metadata":{"trusted":false},"cell_type":"code","source":"def binom1(n,p):\n  if p<n :\n    coef= ...\n    for i in range( ... ):\n      coef= ...\n    return coef\n  else :\n    return ...","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.5 (Boucles imbriquées)\n1. Compléter le programme Python ci-dessous qui calcule le nombre de triplets $(a, b, c) \\in \\mathbb{N}^3$ solutions de\n$$a^2+b^2=c^2 \\quad \\text{ et } \\quad 1 \\leq a \\leq b \\leq c \\leq 50 .$$"},{"metadata":{"trusted":false},"cell_type":"code","source":"Compteur = 0\n\nfor c in ... :\n    for b in ... :\n        for a in ... :\n            if ... :\n                Compteur+=1\n\nprint(Compteur)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Même question en modifiant l'exposant $2$ par $3$, $4$, $5$, $\\ldots$. Que remarque-t-on?"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.6 (Sommes doubles)\nOn considère les sommes doubles suivantes :\n$$\\displaystyle S_n=\\sum_{1 \\leq i, j \\leq n} \\frac{i}{2^j} \\quad \\text{ et } \\quad T_n=\\sum_{1 \\leq i \\leq j \\leq n} \\frac{i^3}{j(j+1)}.$$\n\n1.a Ecrire un programme qui, étant donné un entier $n \\geq 1$, calcule et affiche $S_n$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"1.b Même question pour $T_n$."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Calculer à la main $S_n$ et $T_n$ en fonction de $n$."},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"#### Exercice II.7 (Suites imbriquées)\nOn considère les suites $\\left(a_n\\right)_{n \\in \\mathbb{N}}$ et $\\left(b_n\\right)_{n \\in \\mathbb{N}}$ définies par $a_0=1, b_0=2$ et les relations:\n$$\\forall\\, n \\in \\mathbb{N}, \\; a_{n+1}=\\frac{a_n^2}{a_n+b_n} \\quad \\text{ et } \\quad b_{n+1}=\\frac{b_n^2}{a_n+b_n}.$$\n\nÉcrire une fonction \\pyv{suites} ayant en entrée un entier naturel $n$ et qui renvoie les réels $a_n$, $b_n$."},{"metadata":{"trusted":false},"cell_type":"code","source":"def suites(n) :\n    a = ...\n    b = ...\n    for k in ... :\n        ...\n    return ...","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"}},"nbformat":4,"nbformat_minor":2}