Exercices corrigés de récursivité en Python ( Série 12)
Exercice 1
Soit une chaine de caractères, écrire un algorithme récursif permettant de déterminer sa longueur
Corrigé
def longueur(ch): if not ch: return 0 else: return 1+longueur(ch[1:]) ch = "Take It Easy" print(longueur(ch))
Exercice 2
Rendre récursive la fonction somme suivante :
def somme(L): s=0 : for val in L : s+=val return s
Corrigé
def somme(L): if not L: return 0 return L[0]+somme(L[1:])
Exercice 3
Pour convertir un nombre entier positif N de la base décimale à la base binaire, il faut opérer par des divisions successives du nombre N par 2. Les restes des divisions constituent la représentation binaire.
Ecrire une fonction récursive « Binaire » permettant d’imprimer à l’écran la représentation binaire d’un nombre N (voir exemple en face).
Corrigé
def binaire(N): if N == 0: return [] return binaire(N//2)+[N % 2] print(binaire(13))
Exercice 4
La suite de Fibonacci est définie comme suit :
$$ F_n= \left\{ \begin{array}{ccr} 1 & n \lt 2 \\ F_{n-1}+F_{n-2} & sinon \\ \end{array} \right. $$
Ecrire un programme récursif calculant Fib(n)
Corrigé
def Fib(n): if n <= 2: return 1 return Fib(n-1)+Fib(n-2) print(Fib(4))
Exercice 5
Soit la suite définie par :
$$ U_n= \left\{ \begin{array}{ccr} 1 & n \lt 2 \\ 3U_{n-1}+U_{n-2} & sinon \\ \end{array} \right. $$
Ecrire un programme récursif permettant de calculer le nième terme de la suite;
Corrigé
def Suite(n): if n <= 2: return 1 return 3*Suite(n-1)+Suite(n-2) print(Suite(4))
Exercice 6
Un nombre \(N\) est pair si \((N-1)\) est impair, et un nombre N est impair si \((N-1)\) est pair.
Ecrire deux fonctions récursives mutuelles pair(N) et impair(N) permettant de savoir si un nombre N est pair et si un nombre N est impair.
Corrigé
def Pair(N): if N == 1: return False return Impair(N-1) def Impair(N): if N == 1: return True return Pair(N-1)
Exercice 7
Soit un tableau X de N entiers, écrire une fonction récursive simple permettant de déterminer le maximum du tableau
Corrigé
def maximum(T): if len(T) == 1: return T[0] # principe de la recherche dichotomique m = len(T)//2 max1 = maximum(T[:m]) max2 = maximum(T[m:]) if max1 > max2: return max1 return max2
Exercice 8
Un tableau X est trié par ordre croissant si \(x(i) \le x(i+1), \forall i \), écrire un algorithme récursif permettant de vérifier qu’un tableau X est trié ou non
Corrigé
def Esttrier(T): if len(T) == 0 or len(T) == 1: return True if T[0] <= T[1]: return Esttrier(T[1:]) return False T = [1, 2, 3, 4, 4, 5, 7, 8] print(Esttrier(T))
Exercice 9
Un mot est un palindrome si on peut le lire dans les deux sans de gauche à droite et de droite à gauche. Exemple KAYAK est un palindrome. Ecrire une fonction récursive permettant de vérifier si un mot est palindrome.
Corrigé
def palindrome(ch): if len(ch) == 1 or len(ch)==0: return True if ch[0] == ch[-1]: return palindrome(ch[1:len(ch)-1]) return False ch = "KAYAK" print(palindrome(ch))
Exercice 10
Soit un tableau d’’entiers contenant des valeurs 0 ou bien 1. On appel composante connexe une suite contigue de nombres égaux à 1. On voudrait changer la valeur de chaque composante connexe de telle sorte que la première composante ai la valeur 2 la deuxième ai la valeur 3, la 3ème ait la valeur 4 et ainsi de suite. Réaliser deux fonctions :
- La première fonction n’est pas récursive et a pour rôle de chercher la position d’un 1 dans un tableau.
- La deuxième fonction est récursive. Elle reçoit la position d’un 1 dans une séquence et propage une valeur x à toutes les valeur 1 de la composante connexe.
Corrigé
# Trouver l'indice du premier 1 def trouver(T): for i in range(len(T)): if T[i] == 1: return i return None # Fonction principale def propage(T, x, val): i = trouver(T) if i is None: return T[i] = val if (len(T)-i+1) > 2: if T[i+1] == 1: propage(T, x, val+1) else: propage(T, x, x) # tester la fonction T = [0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1] x = 2 propage(T, x, x) print(T)
Exercice 11
Soit une image binaire représentés dans une matrice à 2 dimension. Les éléments m[i][j] sont dits pixels et sont égaux soit à 0 soit à 1. Chaque groupement de pixels égaux à 1 et connectés entre eux forment une composante connexe(figure). L’objectifs est de donner une valeur différente de 1 à chaque composante (2 puis 3 puis 4 etc.)
- Ecrire une fonction récursive propager permettant de partir d’un point (i,j) situé à l’intérieur d’une composante connexe et de propager une étiquette T à tous les pixels situés à l’intérieur de la composante.
- Ecrire une fonction etiqueter permettant d’affecter une étiquette différente à chaque composante connexe.
Corrigé
def propager(M, i, j, val): if M[i][j] == 0: return M[i][j] = val if((i-1) >= 0 and M[i-1][j] == 1): # l'élément en haut propager(M, i-1, j, val) if((i+1) < len(M) and M[i+1][j] == 1): # l'élément en bas propager(M, i+1, j, val) if((j-1) < len(M) and M[i][j-1] == 1): # l'élément a gauche propager(M, i, j-1, val) if((j+1) < len(M) and M[i][j+1] == 1): # l'élément a droite propager(M, i, j+1, val) def etiqueter(M): L, C = len(M), len(M[0]) val = 2 for i in range(L): for j in range(C): if(M[i][j] == 1): propager(M, i, j, val) val += 1 M = [[0, 0, 1, 0], [0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0]] print(M) etiqueter(M) print(M)