On commence: بسم الله
En Python, on peut créer des fonctions, c’est-à-dire un ensemble d’instructions regroupées sous un nom. Ces fonctions peuvent accepter un certain nombre d’entrées (de 0 à un nombre infini).
Par exemple, la fonction d’une droite prend une abscisse x
, un coefficient a
et une constante b
, et renvoie comme output (résultat) : a*x + b
(qu’on nom y
par convention).
Pour que le PC comprend qu’on va définir une fonction, on commence par écrir def
et pour qu’il comprend ce qu’il faut retourner comme output, on utilise l’instruction return
.
Syntaxe:
def *nom de la fonction* (*input 1*, *input 2*, ...) : ligne 1 ligne 2 ... return *output*
NB:
- Le nom de la fonction doit respecter les memes règles pour définir une variable ( on a déjà parler de ça dans le cours de
1- Introduction
) et ne doit pas avoir un nom d’une fonction prédéfinie en Python ( commeint ()
oulen ()
, … ). - Une fonction peut etre sans inputs
- Regarde bien le syntaxe, pour les fonctions on n’affecte pas lune variable en utilisant
=
mais en utilisantdef
et le nom vient aprèsdef
.
Exemple : equation d’une droite
On va écrir le code qui défini l’équation de la droite.
Ne t’inquiète pas, je me souviens du temps quand j’étais en SUP et j’ai entendu le prof dire qu’on doit définir une équation en Python. Je n’ai pas compris la relation entre les deux 🤣🤣.
Mais je t’explique, on sait que l’équation de la droite s’écrit sous la forme y = a*x + b
, n’est-ce pas? Donc, si l’utilisateur me donne les valeurs de a
, x
et b
je peux connaitre et retourner la valeur de y
en utilisant la formule. C’est tout simplement ça: Je vais érire une fonction qui prend a
, x
et b
comme input et retourne y = a*x + b
comme output.
Remarque :
Dans les cours précédents, nous avons vu que ne pas attribuer de valeur à une variable provoque une erreur. Pour les fonctions, il suffit que les variables soient définies comme paramètres d’entrée (inputs). Si une variable n’est ni définie comme paramètre d’entrée ni attribuée à une valeur, cela entraînera également une erreur.
Maintenant on refait la meme fonction droite mais x étant une liste de flottants ( par exemple un utilisateur qui veut les ordonnées (les y
s) pour plusieurs abscisses mais pour la meme droite (meme a
et b
) )
Important !!
- Tu vois que lorsqu’on a définit la fonction
droite
, on a définit 3 inputs:a
,x
etb
. Alors comment peut on remplacerx
parelement
? On ne doit pas le nommerx
? Non, parce qu’en Python, le PC va seulement considérer la valuer du 1er, 2ème et 3ème input et va les remplacer dans le code de la fonction : donc c’est l’ordre des inputs qui compte et pas leur nom. - Lorsque le code atteint la ligne qui contient l’instruction
return
, il va s’arreter et va ignorer toute les lignes qui viennent après, donc soit sur de mettrereturn
à la fin de la définition.
Me contacter:
Si tu as des problèmes de compréhension meme avec ces explications, tu peux me contacter ou bien regarder les vidéos d’explication sur Youtube
Valeurs des inputs par défaut
Pour utiliser la fonction droite
qu’on a définit au dessus, on doit forcément donner 3 valeurs comme inputs, sinon on va avoir une erreur:
Regardons le message d’erreur : il indique que l’argument b
est manquant. Cela arrive parce que, comme mentionné précédemment, Python remplace les paramètres de la définition de la fonction par les valeurs que vous fournissez lors de l’appel. Ici, Python comprend que 6 correspond au premier paramètre a
, et que 4 correspond au second paramètre x
. Cependant, il ne trouve aucune valeur pour b, ce qui provoque l’erreur, car Python ne sait pas quoi faire dans ce cas.
Mais si on veut que la valeur de b
soit 0
par défaut ( lorsque la fonction est appelée avec seuelemnt 2 arguments ), tu dois lui attribuer 0
lors de la définition de la fonction :
NB:
Si une fonction est définie avec n
arguments et on l’appelle avec p>n
arguments, un message d’erreur va etre affiché, regarde l’exemple de la fonction droite
si on l’appelle avec 4 arguments (et lit le message accompagné à l’erreur
Fonctions sans output:
Une fonction peut etre sans output, c-à-d que définir une fontion sans instruction return
ne va pas causer une erreur.
Regarde l’exemple suivant:
Fonctions à plusieurs outputs:
Une fonction peut avoir 2 outputs ou plus.
Par exemple, on veut une fonction qui prend en argument 2 entiers n
et p
et retourne n
puissance p
et p
puissance n
NB
On peut transformer les fonctions à plusieurs outputs en fonctions à un seul output en regroupant les outputs dans une liste ( C’est ça ce que je fais ).
Fonctions récursives
On appelle fonction récursive
toute fonction qui s’appelle elle meme pendant l’exécution. Tout simplement f(n)
dépend de f(n-1)
( pas forcément n-1
, mais dépend d’un entier inférieur à n
)
Hein? Comment ça?
S’elle appelle-elle meme, elle s’arrete où ?
Pour les fonctions récursives on doit toujours donner la valeur de l’output pour un entier initial n0 c-à-d qu’on programmer la fonction que si l’argument n
vaut n_0
, retourne une certaine valeur (regarde les exemples et tu va comprendre mieux inshaalah).
Maintenant f(n_0)
est connue, donc ça va causer une série d’exécution de la fonction f
:
f(n)
dépend def(n-1)
qui dépend def(n-2)
… qui dépend def(n_0)
. Et puisqu’on connaitf(n_0)
, on peut trouverf(n_1)
… jusqu’àf(n)
NB: Dans la plupart des cas, n_0
vaut 0 ou bien 1 mais je voulais montrer que l’entier initial peut avoir n’importe quelle valeur
Exemple: Factorielle
On va développer la fonction factorielle (n)
(notée en maths: n!
) qui vaut n*(n-1)*...*1
Solution proposée
Exercices
Ex 1: Fibonacci
La fonction est la fonction définie par: F(n)=F(n−1)+F(n−2) avec F(0)=0 et F(1)=1
Définit cett fonction en Python:
Ex 2
Soit une chaine de caractères, écrire un algorithme récursif permettant de déterminer sa longueur
Ex 3
Un tableau X est trié par ordre croissant si x(i)≤x(i+1),∀i
Ecrire un algorithme récursif permettant de vérifier qu’un tableau X est trié ou non
Exercice : Conversion d’une chaîne binaire en décimal à l’aide d’une fonction récursive
Objectif :
Écrire une fonction récursive qui prend en entrée une chaîne composée uniquement de caractères 0
et 1
, représentant un nombre en base binaire, et qui renvoie sa valeur décimale.
Explication :
- Une chaîne binaire est une suite de caractères
0
et1
représentant un nombre dans le système binaire (base 2). - Votre tâche est d’écrire une fonction récursive qui effectue la conversion d’un nombre binaire en un nombre décimal (base 10).
Instructions :
- Définition de la fonction :
- La fonction prendra en entrée une chaîne de caractères composée uniquement de
0
et1
. - La fonction renverra un nombre entier, qui est la représentation décimale du nombre binaire.
- La fonction prendra en entrée une chaîne de caractères composée uniquement de
- Récursivité :
- L’algorithme doit être défini de manière récursive.
- Formule de conversion :
- La conversion d’un nombre binaire à décimal est basée sur la position des bits dans la chaîne. Le bit à la position ( n ) a une valeur de ( 2n ).
- Exemple : pour la chaîne binaire
"1011"
(en base 2), la conversion en décimal se fait comme suit : [ 1×23+0×22+1×21+1×20=11 (en base 10). ]
Exemple d’entrée et de sortie :
- Entrée :
"1101"
- Sortie :
13
Contraintes :
- Vous devez utiliser une approche récursive, sans utiliser de boucles (ni
for
, niwhile
). - Ne pas utiliser de fonction Python préexistante pour convertir le binaire en décimal (comme
int()
avec l’argument de base).
Pseudocode (aide) :
Voici une suggestion de la manière dont vous pouvez aborder la récursion :
- Cas de base : si la chaîne est vide, la valeur retournée est 0.
- Récursion : prenez le premier caractère de la chaîne, convertissez-le en décimal, et appelez la fonction récursive sur le reste de la chaîne.
Bonne chance à tous, et assurez-vous de bien comprendre comment chaque bit contribue à la valeur totale du nombre en base 10 !