Fonctions

Dans un programme, de nombreuses phases sont répétées à divers endroits du code (sommer ou multiplier des vecteurs 3D dans un moteur physique par exemple). Pour éviter de devoir replacer toutes ces instructions à chaque fois on définis des sous-programmes réutilisables à volonté, appelés fonctions.

Définition

Une fonction est un programme. Elle a ainsi :

  • un nom
  • des paramètres d'entrée
  • une sortie
  • des instructions, appelées corps de la fonction

Une fois définie, on peut l'appeler comme une instruction (sa sortie est affectée à la variable sortie dans l'exemple ci-après) :

sortie  nom(entrée_1, ..., entrée_n)

Fonctions et algorithmes

Appels de fonctions

On peut définir des fonctions puis les utiliser ensuite comme dans tout langage de programmation. Considérons l'algorithme de recherche :

algorithme recherche(t: [entier],
                     x: entier
                    )  booléen:

    pour chaque e de t:
        si e == x:
            rendre Vrai
    rendre Faux

On peut utiliser le pseudo code de nom recherche dans d'autres pseudo-code comme une fonction. Par exemple :

t  [1, 2, 6]
trouve  recherche(t, 6)
affiche à l'écran trouve

Est un pseudo-code valide puisque recherche est bien défini et utilisé correctement (le type de ses paramètres est correct).

Pseudo-code avec fonctions

On peut aussi directement coder des fonctions dans un pseudo-code. Par exemple :

fonction recherche(t: [entier],
                    x: entier
                    )  booléen:

    pour chaque e de t:
        si e == x:
            rendre Vrai
    rendre Faux

algorithme exorcisme(t: [entier]
                    )  str:

    si recherche(t, 666):
        rendre "Aspergez votre ordinateur d'eau bénite. Vite !"
    sinon:
        rendre "Tout va bien, le tableau n'est pas possédé. Ouf."

Signature d'une fonction

Lorsque l'on défini un algorithme ou un pseudo-code on explicite le type des objets en entrées et en sortie, comme on l'a fait pour l'algorithme recherche.

Lorsque l'on code une fonction en python on a pas toujours l'habitude (ni le besoin) de le faire, mais on peut le spécifier en utilisant les signatures de fonctions, qui correspond juste à la description de son bloc :

Définition

Une signature de fonction associe :

  • son type à chaque paramètre (précédé d'un :)
  • le type de sortie (précédé d'un ->)

Par exemple, la signature de la fonction recherche est :

recherche(t: [entier], x: entier) -> booléen

Variables locales

Il est important de voir que lorsque l'on exécute une fonction, les variables qu'elle crée existeront dans un espace à elle, pas dans celui du pseudo-code appelant. Le code suivant affichera 4 et pas 6 qui est dernière valeur prise par la variable e de la fonction recherche :

e  4
t  [1, 2, 6]
trouve  recherche(t, 6)
affiche à l'écran trouve

Objet fonction

Une fonction peut être associée à un nom comme tout autre objet. Par exemple, en supposant que la fonction recherche soit définie :

f  recherche
t  [1, 2, 6]
trouve  f(t, 6)

affiche à l'écran trouve

Ne confondez pas nom qui est l'algorithme et nom(a, b) qui est le résultat de son exécution avec les paramètres a et b.

Récursivité

Le fait que les variables et les noms définies dans les fonctions restent dans le cadre de la fonction actuellement exécuté nous donnent accès à la récursivité : Il suffit que notre pseudo-code s'appelle lui-même comme une fonction.

Attention aux conditions d'arrêts pour garantir qu'une fonction ne s'appelle pas indéfiniment.