Mathématiques, Cinéma, Informatique

Algorithmes

Algorithmes au programme du cycle terminal

1. Préliminaires

import random

# création d'un tableau de n entiers aléatoires compris entre 0 et N

def creation_tableau(N,n):
    tableau = []
    for i in range(n):
        tableau.append(random.randint(0,N))
    return tableau

T=creation_tableau(100,15)

2. Recherche d’une occurrence dans un tableau

a. en impératif

def recherche_occurrence(tableau, element):
    """
    recherche l'indice d'une occurrence d'un élément dans un tableau
    :param tableau: (list) un tableau
    :param element:(any)
    :return: (int)
    :CU: elt appartient à tableau
    """
    indice = 0
    while indice != len(tableau) and tableau[indice] != element:
        indice += 1
    return indice

b. en récursif

def recherche_occurrence_recursive(tableau, element):
    """
    recherche l'indice d'une occurrence d'un élément dans un tableau
    :param tableau: (list) un tableau
    :param element:(any)
    :return: (int)
    :CU: elt appartient à tableau
    """
    if tableau[0] == element:
        return 0
    else:
        return 1 + recherche_occurrence_recursive(tableau[1:], element)

c. en récursif terminal

def recherche_occurrence_recursive_terminale(tableau, element, indice = 0):
    """
    recherche l'indice d'une occurrence d'un élément dans un tableau
    :param tableau: (list) un tableau
    :param element:(any)
    :return: (int)
    :CU: elt appartient à tableau
    """
    if tableau[0] == element:
        return indice
    else:
        return recherche_occurrence_recursive_terminale(tableau[1:], element, indice+1)

3. Recherche d’un maximum

a. en impératif

def recherche_max(tableau):
    """
    recherche le maximum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    maxi = tableau[0]
    for i in range(1,len(tableau)):
        if tableau[i] > maxi:
            maxi = tableau[i]
    return maxi

b. en récursif

def recherche_max_recursive(tableau):
    """
    recherche le maximum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if len(tableau)==1:
        return tableau[0]
    else:
        if tableau[0] > recherche_max_recursive(tableau[1:]):
            return tableau[0]
        else:
            return recherche_max_recursive(tableau[1:])

c. en récursif terminal

def recherche_max_recursive_terminale(tableau, maxi = None):
    """
    recherche le maximum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if maxi == None:
        maxi = tableau[0]    
    if len(tableau) == 0:
        return maxi
    else:
        if tableau[0] > maxi:
            maxi = tableau[0]
        return recherche_max_recursive_terminale(tableau[1:], maxi)

4. Recherche d’un minimum

a. en impératif

def recherche_min(tableau):
    """
    recherche le minimum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    mini = tableau[0]
    for i in range(1,len(tableau)):
        if tableau[i] < mini:
            mini = tableau[i]
    return mini

b. en récursif

def recherche_min_recursive(tableau):
    """
    recherche le minimum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if len(tableau)==1:
        return tableau[0]
    else:
        if tableau[0] < recherche_min_recursive(tableau[1:]):
            return tableau[0]
        else:
            return recherche_min_recursive(tableau[1:])

c. en récursif terminal

def recherche_min_recursive_terminale(tableau, mini = None):
    """
    recherche le minimum parmi les valeurs d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if mini == None:
        mini = tableau[0]    
    if len(tableau) == 0:
        return mini
    else:
        if tableau[0] < mini:
            mini = tableau[0]
        return recherche_min_recursive_terminale(tableau[1:], mini)

5. Recherche dichotomique dans un tableau trié

a. en impératif

def recherche_dicho(tableau, element):
    """
    recherche un élément dans un tableau d'entiers triés
    :param tableau: (list) un tableau
    :param element: (int) un entier
    :CU: tableau doit être trié
    :return: (int) -1 si l'element n'est pas dans le tableau, l'indice d'une occurrence de l'element sinon
    """
    indice_gauche = 0
    indice_droit = len(tableau)-1
    indice_milieu = (indice_gauche + indice_droit) // 2
    while element != tableau[indice_milieu] and indice_gauche < indice_droit:
        if element < tableau[indice_milieu]:
            indice_droit = indice_milieu -1
        else:
            indice_gauche = indice_milieu + 1
        indice_milieu = (indice_gauche + indice_droit) // 2
    if element == tableau[indice_milieu]:
        return indice_milieu
    else:
        return -1

b. en récursif

def recherche_dicho_recursive(tableau, element, indiceGauche = 0, 
                indiceDroit = None):
    """
    recherche un élément dans un tableau d'entiers triés
    :param tableau: (list) un tableau
    :param element: (int) un entier
    :return: (int) -1 si l'element n'est pas dans le tableau, l'indice d'une occurrence de l'element sinon
    :CU: tableau doit être trié, element doit appartenir à tableau
    """
    if indiceDroit == None:
        indiceDroit = len(tableau)-1
    indiceMilieu = (indiceGauche + indiceDroit) // 2
    if indiceDroit < indiceGauche :
        return -1
    elif element == tableau[indiceMilieu]:
        return indiceMilieu
    else:
        if element < tableau[indiceMilieu]:
            return recherche_dicho_recursive(tableau, element, indiceGauche,
                    indiceMilieu - 1)
        else:
            return recherche_dicho_recursive(tableau, element, indiceMilieu + 1,
                    indiceDroit)

c. en récursif terminal

def recherche_dicho_recursive_terminale(tableau, element, indiceGauche = 0, 
            indiceDroit = None, acc = -1):
    """
    recherche un élément dans un tableau d'entiers triés
    :param tableau: (list) un tableau
    :param element: (int) un entier
    :return: (int) -1 si l'element n'est pas dans le tableau, l'indice d'une occurrence de l'element sinon
    :CU: tableau doit être trié
    """
    if indiceDroit == None:
        indiceDroit = len(tableau)-1
    indiceMilieu = (indiceGauche + indiceDroit) // 2
    if indiceDroit < indiceGauche :
        return acc
    elif element == tableau[indiceMilieu]:
        acc = indiceMilieu
        return acc
    else:
        if element < tableau[indiceMilieu]:
            return recherche_dicho_recursive_terminale(tableau, element, indiceGauche, 
                    indiceMilieu - 1, acc)
        else:
            return recherche_dicho_recursive_terminale(tableau, element, indiceMilieu + 1, 
                    indiceDroit, acc)

6. Calcul de la somme des éléments d’un tableau

a. en impératif

def somme(tableau):
    """
    recherche la somme des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    somme = 0
    for elt in tableau:
        somme += elt
    return somme

b. en récursif

def somme_recursive(tableau):
    """
    recherche la somme des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if len(tableau)==0:
        return 0
    else:
        return tableau[0] + somme_recursive(tableau[1:])

c. en récursif terminal

def somme_recursive_terminale(tableau, somme = 0):
    """
    recherche la somme des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (int)
    """
    if len(tableau) == 0:
        return somme
    else:
        return somme_recursive_terminale(tableau[1:], somme + tableau[0])

7. Calcul de la moyenne des éléments d’un tableau

a. en impératif

def moyenne(tableau):
    """
    recherche la moyenne des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (float)
    """
    somme = 0
    for elt in tableau:
        somme += elt
    return somme/len(tableau)

b. en récursif

def moyenne_recursive(tableau):
    """
    recherche la moyenne des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (float)
    """
    if len(tableau) == 0:
        return 0
    else:
        return ((len(tableau)-1)*moyenne_recursive(tableau[1:])+tableau[0])/len(tableau)

c. en récursif terminal

def moyenne_recursive_terminale(tableau, moyenne=0, n=None):
    """
    recherche la moyenne des elements d'un tableau d'entiers
    :param tableau: (list) un tableau
    :return: (float)
    """
    if n == None:
        n = len(tableau)
    if len(tableau) == 0:
        return moyenne
    else:
        return moyenne_recursive_terminale(tableau[1:], (n*moyenne+tableau[0])/n,n)

8. Tri par sélection

a. la fonction échange, nécessaire au tri par sélection

def echange(tableau, i, j):
    """
    echange les éléments d'indice i et j d'un tableau
    :param tableau: (list) un tableau
    :param i:(int) un entier
    :param j:(int) un entier
    :CU: 0 <= i < len(tableau)
        0 <= j < len(tableau)
    :return: (None)
    :Side-effects: Le tableau est modifié
    """
    tableau[i], tableau[j] = tableau[j], tableau[i]

b. en impératif

def tri_selection(tableau):
    """
    trie un tableau
    :param tableau: (list) un tableau
    :return: (list) le tableau trié
    :Side-effects: Le tableau est modifié
    """    
    for i in range(len(tableau)):
        indice_mini = i
        for j in range(i+1, len(tableau)):
            if tableau[indice_mini] > tableau[j]:
                indice_mini = j
        echange(tableau, i, indice_mini)
    return tableau

c. en récursif

def tri_selection_recursive(tableau):
    """
    trie un tableau
    :param tableau: (list) un tableau
    :return: (list) le tableau trié
    :Side-effects: Le tableau est modifié
    """
    if len(tableau) <= 1:
        return tableau
    else:
        indice_mini = 0
        for i in range(1, len(tableau)):
            if tableau[indice_mini] > tableau[i]:
                indice_mini = i
        echange(tableau, 0, indice_mini)
        return [tableau[0]]+tri_selection_recursive(tableau[1:])

d. en récursif terminal

def tri_selection_recursive_terminal(tableau, resultat=[]):
    """
    trie un tableau
    :param tableau: (list) un tableau
    :return: (list) le tableau trié
    :Side-effects: Le tableau est modifié
    """
    if len(tableau) == 0:
        return resultat
    else:
        indice_mini = 0
        for i in range(1, len(tableau)):
            if tableau[indice_mini] > tableau[i]:
                indice_mini = i
        echange(tableau, 0, indice_mini)
        return tri_selection_recursive_terminal(tableau[1:], resultat + [tableau[0]])

9. Tri par insertion

a. la fonction insertion, nécessaire au tri par insertion

def insertion(tableau, element):
    """
    insère un élément dans un tableau d'entiers triés
    :param tableau: (list) un tableau
    :param element: (int) un entier
    :CU: tableau doit être trié
    :return: (None)
    :Side-effects: Le tableau est modifié
    """
    indice = 0
    while len(tableau) != 0 and indice != len(tableau) and tableau[indice] < element:
        indice += 1
    return tableau[:indice]+[element]+tableau[indice:]

b. en impératif

def tri_insertion(tableau):
    """
    trie un tableau
    :param tableau: (list) un tableau
    :return: (list) le tableau trié
    """
    resultat = []
    for i in range(len(tableau)):
        resultat = insertion(resultat, tableau[i])
    return resultat

10. Tri fusion

a. en récursif – méthode diviser pour régner

def tri_fusion(liste, debut=0, fin=None):
    """
    tri la liste mise en paramètre entre les indice debut et fin
    :param liste:(list) une liste
    :param debut:(int) un entier, par défaut 0
    :param fin:(int ou NoneType) un entier, par défaut None
    :CU: debut>=0, fin>=0
    """
    if fin == None:
        fin = len(liste)-1
    if debut<fin:
        #Diviser le problème
        milieu=(debut+fin)//2
        #Résoudre chaque sous-problème
        tri_fusion(liste,debut,milieu)
        tri_fusion(liste,milieu+1,fin)
        #combine les solutions des sous-problèmes
        fusion(liste,debut,milieu,fin)

def fusion(liste,debut,pivot,fin):
    """
    Replace les éléments de la liste compris entre les indices debut et fin dans l'ordre croissant.
    :param liste:(list) une liste
    :param debut:(int) un entier
    :param pivot:(int) un entier
    :param fin:(int ou NoneType) un entier
    :CU: debut>=0, fin>=0, pivot>=0, debut<fin
    """
    gauche=[]
    droite=[]
    for indice in range(debut,pivot+1):
        gauche.append(liste[indice])
    for indice in range(pivot+1,fin+1):
        droite.append(liste[indice])
    i=0
    j=0
    for k in range(debut,fin+1):
        if i==len(gauche) and j<len(droite):
            liste[k]=droite[j]
            j+=1
        elif j==len(droite) and i<len(gauche):
            liste[k]=gauche[i]
            i+=1
        elif gauche[i]<=droite[j]:
            liste[k]=gauche[i]
            i+=1
        else:
            liste[k]=droite[j]
            j+=1

Téléchargement du fichier Python avec tous ces algorithmes. Le fichier sera à décompresser.