Aller au contenu

TP Python – Calculer des suites en Python

BTS SIO SISR 2e année – Pour aller plus loin – S01

Note

Comment ce TP fonctionne. Chaque exercice a un éditeur Python intégré à la page (il s'exécute dans ton navigateur, rien à installer). Avant de lancer, écris sur ta feuille ce que tu anticipes (« J'anticipe »). Puis lance et compare. Le bouton Valider exécute des tests : un test réussi ne dispense pas de comprendre pourquoi.

Exercice A – Formule explicite

Écris terme_explicite(n) qui renvoie \(u_n = 3n^2 - n + 2\).

J'anticipe. Pour n = 3, calcule à la main \(u_3\) avant de coder.

###
assert termepy-undexplicite(0) == 2bksl-nlassert termepy-undexplicite(1) == 4bksl-nlassert termepy-undexplicite(2) == 12bksl-nlassert termepy-undexplicite(3) == 26bksl-nlassert termepy-undexplicite(10) == 292bksl-nlbksl-nl ∞/∞

def termepy-undexplicite(n):bksl-nl """Renvoie upy-undn = 3n^2 - n + 2."""bksl-nl ...bksl-nlbksl-nl



Exercice B – Une suite définie par récurrence

Écris terme_recurrent(u0, n) qui renvoie \(u_n\) pour la suite \(u_{n+1} = 2u_n + 1\) de premier terme u0, avec une boucle.

J'anticipe. Écris la trace de terme pour u0 = 1 et n = 4 avant de coder.

###
assert termepy-undrecurrent(1, 0) == 1bksl-nlassert termepy-undrecurrent(1, 4) == 31bksl-nlassert termepy-undrecurrent(2, 4) == 47bksl-nlassert termepy-undrecurrent(0, 3) == 7bksl-nlassert all(termepy-undrecurrent(1, k) == 2 py-strpy-str (k + 1) - 1 for k in range(0, 30))bksl-nlbksl-nl ∞/∞

def termepy-undrecurrent(u0, n):bksl-nl """Renvoie upy-undn avec upy-und{k+1} = 2 upy-undk + 1."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quel est l'invariant de ta boucle (que vaut terme après k tours) ?

Exercice C – Liste des premiers termes

Écris premiers_termes(f, u0, n) qui renvoie la liste \([u_0, u_1, \dots, u_n]\) pour la suite \(u_{k+1} = f(u_k)\). Par exemple, premiers_termes(lambda x: x + 3, 2, 4) donne [2, 5, 8, 11, 14].

###
assert premierspy-undtermes(lambda x: x + 3, 2, 4) == [2, 5, 8, 11, 14]bksl-nlassert premierspy-undtermes(lambda x: 2 py-str x + 1, 1, 4) == [1, 3, 7, 15, 31]bksl-nlassert premierspy-undtermes(lambda x: x py-str x, 2, 3) == [2, 4, 16, 256]bksl-nlassert premierspy-undtermes(lambda x: x, 5, 0) == [5]bksl-nlassert len(premierspy-undtermes(lambda x: x + 1, 0, 9)) == 10bksl-nlbksl-nl ∞/∞

def premierspy-undtermes(f, u0, n):bksl-nl """Liste [upy-und0, ..., upy-undn] pour upy-und{k+1} = f(upy-undk)."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Combien la liste renvoyée contient-elle d'éléments ? Pourquoi ?

Exercice D – Une suite est-elle croissante ?

Écris est_croissante(liste) qui renvoie True si chaque élément est supérieur ou égal au précédent, False sinon. Une liste vide ou à un seul élément est croissante.

###
assert estpy-undcroissante([1, 2, 2, 5]) == Truebksl-nlassert estpy-undcroissante([3, 2, 4]) == Falsebksl-nlassert estpy-undcroissante([]) == Truebksl-nlassert estpy-undcroissante([7]) == Truebksl-nlassert estpy-undcroissante([0, -3, -4, -3, 0]) == Falsebksl-nlassert estpy-undcroissante([-4, -3, 0]) == Truebksl-nlbksl-nl ∞/∞

def estpy-undcroissante(liste):bksl-nl """True si liste[i+1] >= liste[i] pour tout i."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Un test sur une liste finie prouve-t-il qu'une suite est croissante pour tout \(n\) ? Qu'en conclus-tu ?

Exercice E – Remplissage d'un disque

Un disque contient depart Go à la fin du mois 0 et reçoit ajout Go chaque mois. Écris mois_plein(depart, ajout, capacite) qui renvoie le premier mois \(n\) où la quantité atteint ou dépasse capacite (avec ajout > 0).

J'anticipe. Pour depart = 120, ajout = 15, capacite = 300, quel mois attends-tu (exercice 3) ?

###
assert moispy-undplein(120, 15, 300) == 12bksl-nlassert moispy-undplein(300, 15, 300) == 0bksl-nlassert moispy-undplein(0, 7, 20) == 3bksl-nlassert moispy-undplein(100, 40, 101) == 1bksl-nlbksl-nl ∞/∞

def moispy-undplein(depart, ajout, capacite):bksl-nl """Premier mois n avec depart + n py-str ajout >= capacite."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quel est le variant de ta boucle ? Pourquoi s'arrête-t-elle si ajout > 0 ?