Exercices corrigés de récursivité en Python ( Série 12)

Do you want to read our courses in English? please visit our new website cs-teachers.com Click here

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:
        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 :

  1. La première fonction n’est pas récursive et a pour rôle de chercher la position d’un 1 dans un tableau.
  2. 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.)

  1. 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.
  2. 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])
    etat = True
    val = 2
    while etat == True:
        etat = False
        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)

                            

Partager ce cours avec tes amis :

Rédigé par ESSADDOUKI Mostafa

The education of the 21st century opens up opportunities to not merely teach, but to coach, mentor, nurture and inspire.

Commentaire(s)