Aller au contenu

TP Python – Listes et chaînes en récursif

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

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 – Somme d'une liste

Écris somme_liste(L) de façon récursive (pas de sum, pas de boucle).

J'anticipe. Combien d'appels pour une liste de 3 éléments ?

###
assert sommepy-undliste([]) == 0bksl-nlassert sommepy-undliste([4, 7, 1]) == 12bksl-nlassert sommepy-undliste([-2, 2]) == 0bksl-nlassert sommepy-undliste(list(range(100))) == 4950bksl-nlbksl-nl ∞/∞

def sommepy-undliste(L):bksl-nl """Somme des elements de L, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Exercice B – Maximum

Écris maximum(L) (liste non vide) de façon récursive, sans max.

###
assert maximum([3, 9, 4]) == 9bksl-nlassert maximum([5]) == 5bksl-nlassert maximum([-4, -2, -9]) == -2bksl-nlassert maximum([1, 8, 8, 3]) == 8bksl-nlassert all(maximum([a, b, c]) == max(a, b, c) for a in range(-2, 3) for b in range(-2, 3) for c in range(-2, 3))bksl-nlbksl-nl ∞/∞

def maximum(L):bksl-nl """Maximum de la liste non vide L, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Pourquoi le cas de base est-il une liste à un élément et non la liste vide ?

Exercice C – Occurrences

Écris compte(L, x) qui renvoie le nombre d'occurrences de x dans L, de façon récursive.

###
assert compte([3, 1, 3, 3, 2], 3) == 3bksl-nlassert compte([], 5) == 0bksl-nlassert compte([1, 2, 3], 9) == 0bksl-nlassert compte(list('banane'), 'a') == 2bksl-nlbksl-nl ∞/∞

def compte(L, x):bksl-nl """Nombre d'occurrences de x dans L, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Exercice D – Palindrome

Écris est_palindrome(s) qui renvoie True si la chaîne se lit pareil dans les deux sens (exactement, sans ignorer majuscules ni espaces), de façon récursive.

J'anticipe. Écris les appels pour "radar" puis "reseau".

###
assert estpy-undpalindrome('radar') == Truebksl-nlassert estpy-undpalindrome('reseau') == Falsebksl-nlassert estpy-undpalindrome('') == Truebksl-nlassert estpy-undpalindrome('a') == Truebksl-nlassert estpy-undpalindrome('kayak') == Truebksl-nlassert estpy-undpalindrome('ab') == Falsebksl-nlassert all(estpy-undpalindrome(w) == (w == w[::-1]) for w in ['abba', 'abca', 'x', 'xyzzyx', 'aab'])bksl-nlbksl-nl ∞/∞

def estpy-undpalindrome(s):bksl-nl """True si s est un palindrome, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quel est le variant ? Pourquoi décroît-il de 2 ?

Exercice E – Inverser une chaîne

Écris inverse(s) qui renvoie la chaîne à l'envers, de façon récursive (sans [::-1]).

###
assert inverse('abc') == 'cba'bksl-nlassert inverse('') == ''bksl-nlassert inverse('a') == 'a'bksl-nlassert inverse('radar') == 'radar'bksl-nlassert all(inverse(w) == w[::-1] for w in ['bonjour', 'ab', 'xyzzy'])bksl-nlbksl-nl ∞/∞

def inverse(s):bksl-nl """Chaine s a l'envers, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Exercice F – Somme des chiffres

Écris somme_chiffres(n) (entier \(n \ge 0\)) de façon récursive, sans str : n % 10 est le dernier chiffre, n // 10 le reste.

###
assert sommepy-undchiffres(2024) == 8bksl-nlassert sommepy-undchiffres(0) == 0bksl-nlassert sommepy-undchiffres(9) == 9bksl-nlassert sommepy-undchiffres(90210) == 12bksl-nlassert all(sommepy-undchiffres(k) == sum(int(c) for c in str(k)) for k in range(0, 3000))bksl-nlbksl-nl ∞/∞

def sommepy-undchiffres(n):bksl-nl """Somme des chiffres decimaux de n, de facon recursive."""bksl-nl ...bksl-nlbksl-nl



Je comprends. Quel est le variant ? Combien d'appels pour un nombre à 4 chiffres ?