Enseigner l'algorithmique

Ce fil sur le forum Mathematex étant très riche, j'ai eu besoin de cette page pour synthétiser et aller plus loin.

Attention, cette page a une haute teneur en subjectivité.

Reste à lire:

Contexte, enjeux, critères

Rentrée 2009, les algorithmes arrivent en seconde, puis se propagent les années suivantes aux autres niveaux. Que doit-on montrer aux élèves, que doivent-ils retenir, quels outils peut-on utiliser?

Cette page recense les langages informatiques, les environnements de travail ainsi que la littérature qui peuvent servir de support.

Pour les définitions, voici quelques liens vers Wikipedia: algorithmique, langage de programmation, environnement de développement.

Les abréviations suivantes seront utilisées pour les critères qui me semblent importants:

  • LL: logiciel libre et ouvert
  • LG: logiciel gratuit mais propriétaire
  • LP: logiciel propriétaire et payant
  • W, L, M: Windows, GNU/Linux, Mac
  • Lisi. / Obsc.: relativement lisible / obscure, pas très lisible
  • Doc-fr / Doc-fr: bien documenté en français (ou non)
  • CF / CF: calcul formel
  • G2, G3: géométrie plane, dans l’espace
  • RW / RW: est utilisé dans le monde réel («Real World»)
  • T (testé perso), TE (testé devant élèves)

Remarques

Il faut voir la construction des algorithmes comme un acte créatif. On part d’une feuille blanche, comme un peintre ou un compositeur.

Il y a une différence entre «faire comprendre une notion mathématique avec l’outil informatique» et «faire comprendre la notion d’algorithme». Exemple: utiliser un tableur pour illustrer des propriétés en statistiques n’a rien à voir avec traverser une liste d’effectifs pour obtenir les effectifs cumulés.

Il y a une différence entre «savoir programmer» et «savoir construire un algorithme». Une certaine structuration de la pensée liée aux algorithmes est nécessaire pour les deux, mais la programmation a pour but l’exécution.

La facilité d’utilisation est trop subjective pour être évoquée ici, pas l’élégance.

Les différences de performances en termes de rapidité d’exécution sur un même algorithme sont hors-sujet, mais un algorithme peut être plus simple ou économe en manipulations (on ne parle pas de l’exécution au niveau du processeur).

Le niveau d’abstraction que l’on doit atteindre est une question délicate. À la fois il est important de comprendre les détails d’une itération, à la fois il faut finir par s’en passer (pour une meilleure lisibilité et la course à l’abstraction). Voici quelques façons d’obtenir une liste de carrés, toutes écrites en Python afin de pouvoir les comparer (même si Python ne se prête pas élégamment à toutes ces farces, notez qu’il peut le faire):

def square_iter_i(list_x):
    # Initialisation de la liste a retourner.
    # Peut se faire "a la" square_iter_x avec un append,
    # mais permet de rester dans l'esprit.
    list_y = [None] * len(list_x)
    # On remplit la liste a retourner, en iterant sur un index.
    for i in range(len(list_x)):
        list_y[i] = list_x[i]**2
    return list_y
 
def square_iter_x(list_x):
    # Initialisation de la liste a retourner, vide au depart.
    list_y = []
    # Ici on itere directement sur le contenu de la liste.
    for x in list_x:
        # Puisqu'on n'a pas l'index, on doit utiliser 'append'.
        list_y.append(x**2)
    return list_y
 
def square_list_comp(list_x):
    # Liste en comprehension.
    return [x**2 for x in list_x]
 
def square_rec(list_x):
    # Recursion:
    if list_x:
        # si la liste n'est pas vide on calcule le carre du premier element,
        # auquel on colle le resultat de la fonction que l'on est en train
        # de definir sur la meme liste mais sans le premier element.
        return [list_x[0]**2] + square_rec(list_x[1:])
    else:
        # si la liste est vide, on retourne une liste vide,
        # c'est la fin de la recursion.
        return []
 
def square_high_order(list_x):
    # On demande simplement d'appliquer la fonction carre
    # sur chaque element de la liste.
    return map(lambda x: x**2, list_x)
 
# Tests
for square_function in [x for x in globals().values() if callable(x)]:
    print(square_function.__name__)
    print(square_function(range(10)))

On voit qu’il y a plusieurs façons d’écrire un programme, même pour faire quelque chose de très simple, et cela au sein d’un seul et même langage. Ne nous interdisons rien et affutons les neurones de nos étudiants. Si on leur montre tous ces chemins, ils sauront trouver celui qui leur ressemble. Certains aimeront rester «près du métal» (langages de bas niveau) et d’autres chercheront l’abstraction (langages de haut niveau).

Logiciels

Langages

Python

Haskell

Caml

Tcl

Ruby

Groovy

Lua

Pascal

C, C++, Java

Environnements de travail

Papier-crayon, langue française ou pseudo-code et diagrammes

Calculatrices

Limites, interprétation de l’affichage.

CASIO

Texas Instrument

Tableurs

Calc

Excel

Algobox

Scratch

Sage

WxGéométrie, Géophar

Xcas

Scilab

Maple

Mathematica

Alice

Linotte

Javascool

TurboPascal, FreePascal

Tutoriels, supports de cours

Langages

Python

Haskell

 
maths/algopeda.txt · Dernière modification: 15/12/2011 21:59 par gra
 
Recent changes RSS feed Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki