2 Python Vs R Structures Algorithmiques
2 Python Vs R Structures Algorithmiques
Résumé
Ce papier traite des structures algorithmiques présentes dans les langages Python et
R, en mettant l’accent sur les structures de données simples telles que les variables et les
constantes. Il explore également les opérations couramment utilisées avec ces structures
et les différentes structures de contrôle disponibles dans ces langages de programmation.
L’objectif est de présenter de manière claire les correspondances entre les éléments de
Python et R, facilitant ainsi la compréhension et la transition entre les deux langages.
Mots clés : Langage Python, Langage R, Structure de données, Structure de contrôle.
∗
Chercheur au Laboratoire d’Optimisation et Apprentissage Automatique, RD Congo.
E-mail : [Link]@[Link].
1 Introduction
Une structure algorithmique est une manière d’organiser les éléments d’un algorithme (et par
extension d’un programme) de manière à faciliter la programmation. Ces structures affectent soit
les données (structures de données), soit la disposition des instructions (structures de contrôle). Les
structures de données et les structures de contrôle font donc partie des grandes classes de structures
algorithmiques (Wirth (1987)).
Les structures de contrôle sont des éléments essentiels dans la programmation impérative et sont
présentes dans tous les langages de programmation impératifs, y compris Python et R. Elles jouent
un rôle crucial en permettant de prendre des décisions, de répéter des actions et de gérer les erreurs
dans un programme. Tant Python que R offrent une gamme de structures de contrôle qui facilitent
la logique et le contrôle du flux d’exécution des instructions. En ce qui concerne les structures de
données, il en existe différentes, allant des plus simples aux plus complexes. Dans cet article, nous
nous concentrerons principalement sur les structures de données simples. Les autres structures seront
explorées plus en détail dans des publications ultérieures. Cependant, les lecteurs intéressés peuvent
se référer aux ouvrages de Goodrich et al. (2013), Venables, W. N. et al. (2023) et celui de Prakash,
Dr. PKS and Rao, Achyutuni Sri Krishna (2016) qui abordent, entre autres, les sujets des structures
de données dans les langages Python et R.
Le reste de papier se structure de la manière suivante. Nous commençons par présenter dans la
section 2 les structures algorithmiques de manière générale, ensuite nous procédons à la présentation
des structures algorithmiques du langage Python dans la section 3, puis présentons les structures
algorithmiques du langage R dans la section 4. Enfin, nous discutons des éléments de comparaison de
ces deux langages dans la section 5 avant de conclure.
Notre environnement est composé de sept données. Les nombres x1 , x2 , s et v̄. Les données x1 , x2 ,
s et v̄ peuvent prendre n’importe quelle valeur ; et ils peuvent même changer de valeur pendant que le
programme est en cours d’exécution. Ce sont des variables. D’ailleurs, si par exemple cinq personnes
se présentent, chacune peut introduire les nombres qu’elle souhaite, ce qui modifiera également les
nombres calculés s et v̄. Par contre, une donnée qui ne peut pas changer de valeur est une constante.
Dans notre cas, 2 est une constante.
23
• son nom ou identificateur (invariable), c’est-à-dire une séquence de caractères (lettres, chiffres
ou encore caractères spéciaux) servant à le concevoir. Un identifiant doit commencer par une
lettre ;
• sa valeur (variable) ;
• son type (peut être (in)variable), qui décrit l’utilisation possible de la variable.
D’après ce qui précède, une variable est comme une cellule (boîte ou case) mémoire qui peut conte-
nir une valeur. Pour pouvoir utiliser une cellule mémoire (une variable), il faut indiquer au processeur
son identifiant et son type à l’aide d’une déclaration. Dans nos pseudo-code 1 , les variables seront
déclarées à l’aide du mot-clé Var, suivi de la liste de noms séparés par des virgules, puis du type des
variables de la liste. Nous conviendrons qu’au moment de la déclaration d’une variable, sa valeur est
indeterminée.
Comme dit plus haut, 2 est une constante. De l’espace mémoire peut également être réservé pour
cette constante, avec le mot-clé Const, suivi du nom de la constante.
Remarque 2.1. Comme les constantes nommées, dans les langages de programmation de certains pa-
radigmes, comme dans les langages de programmation fonctionnels et logiques, les soi-disant variables
conservent une seule variable tout au long de leur vie en raison d’exigences référentielles. De plus, les
variables sont liées à des expressions.
On distingue les types élémentaires dits types simples ou types primitifs ou encore types de base,
et les types de composés.
1. Les types de données primitifs, qui sont des types de données à partir desquels tous les autres
types de données sont construits. Les types de données primitifs sont généralement atomiques et
ne peuvent pas être décomposés en éléments plus petits. Ils occupent généralement une quantité
fixe de mémoire et peuvent être directement manipulés par des opérations arithmétiques et
logiques (Cormen et al. (2022)).
2. Les types de données composés, qui sont des types de données résultant de l’association de
plusieurs types élémentaires. Les types de données composés courants incluent les listes, les en-
sembles et les dictionnaires. Les éléments d’une collection peuvent être de différents types et ils
peuvent être ajoutés, supprimés ou modifiés dynamiquement (Sedgewick and Wayne (2011)).
La principale différence entre les types de données primitifs et les types de données composites
réside dans leur capacité à stocker et à représenter des informations. Les types de données primitifs
sont utilisés pour représenter des données individuelles et simples, tandis que les types de données
composites permettent de représenter des ensembles de données plus complexes et structurées.
24
• Le type entier (integer), associé aux nombres entiers relatifs, c’est-à-dire aux nombres apparté-
nant à l’ensemble Z.
Exemple 2.1. −2, 4, 952000 et 623 sont des entiers.
• Le type réel (real), associé aux nombres réels (nombres ayant une partie entière et une partie
décimale (ou partie fractionnaire)), c’est-à-dire aux nombres apparténant à l’ensemble R.
Exemple 2.2. −2.25, 4.0, 95.2000 et 0.623 sont des réels.
Dans certains langages de programmation, le type de données «real» est parfois appelé «float»
(nombres à virgule flottante). Cette appellation est justifiée par le fait que les réels sont stockés
sous forme de nombre à virgule flottante, ce qui implique qu’ils sont représentés à l’aide d’une
mantisse et d’un exposant. Cependant, certains langages de programmation réservent le terme
float 2 pour désigner les nombres réels à simple précision, c’est-à-dire ceux qui utilisent 32 bits
pour le stockage. Ces langages font alors une distinction entre float et double, où ce dernier fait
référence aux nombres réels à virgule flottante double précision utilisant généralement 64 bits
pour le stockage.
Selon la richesse d’un langage de programmation, on peut distinguer le type complexe, qui est
associé aux nombres complexes, c’est-à-dire aux nombres appartenant à l’ensemble C.
Cependant, les langages de programmation comme R et Fortran fournissent le type complexe comme
type de base, tandis que d’autres langages de programmation comme Python ou C++ nécessitent des
modules supplémentaires pour les inclure.
B. Types alphanumériques
Le type alphanumérique est constitué de l’ensemble des séquences de caractères que le processeur
peut gérer. Ce caractère peut être une lettre (majuscule ou minuscule), un chiffre, un signe de ponc-
tuation, mais aussi un espace, une tabulation, une nouvelle ligne et quelques autres caractères non
imprimables. La valeur d’un alphanumérique est toujours mis entre « » et dans d’autres langages de
programmation entre ‘ ’. On distingue :
• Le type caractère (character), qui est formé d’un seul caractère.
Exemple 2.3. «d», «5», «K» et « » sont des caractères.
• Le type chaîne de caractères (string), qui est formé par une juxtaposition des caractères.
Exemple 2.4. «Maëlys», «007», «Tome 1» et «vibration» sont des chaînes de caractères.
C. Type booléen
Le type booléen est un type de variable à deux états, généralement noté vrai (true) et faux (false).
Ces valeurs sont également représentées respectivement par 1 et 0 selon les langages de programmation.
25
2.1.5 Opérateurs et opérandes
Un opérateur est souvent un symbole qui joue le rôle d’une fonction dont l’identifiant est généra-
lement écrit avec des caractères non autorisés pour l’identifiant des fonctions ordinaires. Cependant,
un opérateur permet d’agir sur une variable ou d’effectuer des calculs. Un opérande est une donnée
utilisée par un opérateur. La combinaison de ses lexèmes (opérandes, opérateurs, etc.) est appelée
expression.
Exemple 2.5. Dans l’expression 10+4, l’opérateur est + et les opérandes sont les constantes 10 et 4
sont des opérandes.
Chaque expression a une valeur associée (Goulet (2016)). Les symboles des données fondamentales
représentent ces données, conformément à nos attentes. Il est possible de combiner plusieurs expres-
sions pour en former une expression composée. L’évaluation de cette expression se fait généralement
de gauche à droite, à moins que l’ordre d’évaluation ne soit modifié par des parenthèses, à l’instar des
règles mathématiques.
Voici la règle de priorité des opérateurs arithmétiques couramment utilisée, par ordre décroissant
de priorité :
(a) Les parenthèses : les opérations entre parenthèses sont effectuées en premier. Les paren-
thèses peuvent également être imbriquées pour indiquer des niveaux de priorité supplé-
mentaires ;
(b) La puissance ;
(c) La multiplication, la division et le modulo, qui sont évaluées de gauche à droite dans l’ordre
dans lequel elles apparaissent dans l’expression.
(d) L’addition et la soustraction, qui sont également évaluées de gauche à droite dans l’ordre
dans lequel elles apparaissent dans l’expression.
L’utilisation de parenthèses vous permet de modifier l’ordre d’évaluation et de donner une prio-
rité spécifique à certaines parties d’une expression. Tout ce qui se trouve entre parenthèses est
évalué en premier, puis les autres opérations suivent la règle de priorité mentionnée ci-dessus.
26
• La conjonction ou le ET logique, qui renvoie vrai si toutes les expressions booléennes sont
vraies, sinon il renvoie faux.
• La disjonction (inclusive) ou le OU logique, qui renvoie vrai si au moins l’une des expres-
sions booléennes est vraie, sinon il renvoie faux.
• La disjonction exlusive ou le XOU logique, renvoie vrai si exactement l’une des expressions
est vraie, et faux dans tous les autres cas.
Voici la règle de priorité des opérateurs logiques, par ordre décroissant de priorité :
(a) La négation, qui la priorité la plus élevée. Il est généralement évalué avant d’autres opéra-
tions logiques ;
(b) La conjonction ;
(c) La disjonction (inclusive) ;
(d) La disjonction exclusive.
L’utilisation de parenthèses peut également modifier l’ordre d’évaluation des opérations logiques
et donner une priorité spécifique à certaines parties d’une expression logique. Tout ce qui se
trouve entre parenthèses est évalué en premier, puis les autres opérations logiques suivent la
règle de priorité mentionnée ci-dessus.
3. Les opérateurs de comparaison, appelés aussi opérateurs relationnels qui permettent de comparer
deux opérandes et produisent une valeur booléenne. Les opérateurs de comparaisons sont :
• L’égalité : est égal(e) à : = ;
• Les inégalités :
• est inférieur(e) à : < ;
• est supérieur(e) à : > ;
• est inférieur(e) ou égal(e) à : ≤ ;
• est supérieur(e) ou égal(e) à : ≥ ;
• est différent(e) de : ̸=.
L’exécution d’une action fait passer l’environnement d’un état initial particulier à un nouvel état
bien défini. Une action sera primitive ou élémentaire pour un processeur donné si son instruction est
suffisante pour que le processeur puisse l’exécuter sans information supplémentaire. En bref, les actions
élémentaires sont des opérations simples, directement utilisables.
A. Lecture
Définition 2.3. La lecture est une action élémentaire qui consiste à attribuer une valeur à une variable
saisie au clavier.
Pour effectuer une action, le processeur fait une pause et observe le clavier. Chaque touche tapée
au clavier communique une partie des informations attendues au processeur. Pour indiquer la fin de
l’information, l’utilisateur doit valide sa commande. Avant cette validation, l’utilisateur a la possibilité
de modifier les informations saisies.
27
Lire x
où x est l’identificateur de la donnée auquel on doit attribuer une valeur tapée au clavier.
B. Ecriture
Définition 2.4. L’écriture est une action élémentaire qui consiste à faire apparaître une information
à l’écran.
Le format de l’action d’écriture est :
Avant de lire une variable, il est fortement recommandé d’écrire des étiquettes à l’écran, afin
d’avertir l’utilisateur de ce qu’il doit saisir (Darmangeat (2008)).
Exemple 2.8. Soit le programme suivant qui demande à l’utilisateur son nom s’affiche à l’écran :
Var nom en chaîne de caractères
Début
Afficher «C’est quoi votre nom ?»
Lire nom
Afficher «Votre nom de famille est : », nom
Fin.
C. Affectation
Définition 2.5. L’affectation, également appelée assignation par l’anglicisme, est une action élémentaire
qui consiste à attribuer une valeur à une variable.
Dans cette action, on établit un lien entre le nom de la variable et sa valeur (son contenu) (Swinnen
(2012)). Contrairement à l’action de lecture qui permet d’affecter une valeur à un objet en externe,
c’est-à-dire en tapant la valeur au clavier, l’affectation permet de le faire en interne.
28
Exemple 2.9. Soit l’algorithme suivant :
Var x, y, z en entier
Début
x←2
y←4
z←x
x←x+4∗y
Fin.
Exemple 2.10. Reprenons l’illustration du point 2.1.1, avec le calcul de la moyenne arithmétique de
deux nombres. Nous avons l’algorithme suivant :
Var x1 , x2 , s, v̄ en réel
Début
Afficher «Donner le premier nombre»
Lire x1
Afficher «Donner le deuxième nombre»
Lire x2
s ← x1 + x2
v̄ ← s/2
Afficher «La moyenne arithmétique de ces deux nombres : », v̄
Fin.
L’action d’affecter une valeur initiale à une variable est appelée initialisation de variable. Cepen-
dant, plusieurs langages de programmation offrent la possibilité de déclarer et d’initialiser la variable
en même temps.
Une structure de contrôle détermine le flux de contrôle (ou flux d’exécution), c’est-à-dire l’ordre
dans lequel les instructions de l’algorithme doivent être exécutées.
29
La séquence est donc la structure de contrôle implicite. Le contrôle passe ainsi d’une instruction à
l’autre selon l’ordre dans lequel elles apparaissent dans l’algorithme.
Cependant, parfois la séquence est interrompue par un saut, également appelé branchement ou
transfert. Un saut est un transfert de contrôle de l’algorithme vers un emplacement spécifique. La
ligne vers laquelle nous bifurquons est spécifiée à l’aide de son étiquette ou de sa balise. Une étiquette
est un numéro ou un identifiant associé à une instruction de code source. Il est destiné à servir de
cible à une structure de contrôle située ailleurs dans le programme. Hormis ce rôle de localisation, une
étiquette n’a aucun effet sur le programme : elle ne modifie pas le comportement de l’instruction à
laquelle elle est associée.
Il existe deux familles d’instructions qui permettent d’adresser ces étiquettes : les sauts incondi-
tionnels et les sauts conditionnels.
Dans un saut conditionnel, le contrôle est transféré inconditionnellement à une ligne de l’algo-
rithme. Ce saut est systématique, il entraîne une rupture dans le flux d’exécution. L’instruction suivant
le saut dans le programme ne peut donc être atteinte que par un autre saut.
Exemple 2.11. Soit un algorithme qui demande à l’utilisateur son nom et l’affiche en ajoutant au début
«Votre nom est : »
Remarque 2.2. A noter également que les sauts (dont l’instruction Aller à) ont été critiqués, no-
tamment par le mathématicien et informaticien néerlandais Edsger W. Dijkstra, qui deviendra plus
tard son adversaire emblématique. Voulant lutter contre l’utilisation abuside de l’instruction, il écri-
vit en 1968 pour les Communications de l’ACM un article qu’il intitula «A Case against the GOTO
Statement» («Un Procès contre l’instruction ALLER A») (Dijkstra (1968a)). Voulant publier rapide-
ment l’article sous forme de lettre à l’éditeur, l’éditeur Niklaus Wirth l’a renommé «Go To Statement
Considered Harmful» («L’Instruction Aller à considérée comme nuisible») (Dijkstra (1968b)).
B. Arrêt du programme
Un programme s’arrête généralement après l’exécution de la dernière instruction. La plupart des
langages de programmation fournissent également une ou plusieurs instructions pour arrêter l’exécu-
tion du programme à une position arbitraire.
30
2.2.2 Structures alternatives
Définition 2.8. Une structure alternative ou structure conditionnelle est une structure de contrôle
permettant de choisir entre deux ou plusieurs blocs d’instructions.
Si p Alors
s.
Fin Si
Si p Alors
s
Sinon
t.
Fin Si
Si la condition, également appelée test, t est vérifiée, on exécute la séquence d’instructions s sous
les deux formes. Si elle n’est pas vérifiée, dans la seconde forme la séquence d’instructions t est exécuté.
Le délimiteur Fin indique la fin de la séquence d’instructions relatives à la partie Alors pour le
premier formulaire. Pour la deuxième forme, cette terminaison est exécutée par le mot Sinon.
Exemple 2.12. Soit à écrire un algorithme qui calcule la valeur absolue d’un réel x.
Var x, val_abs en réel
Début
Afficher «Entrez le nombre réel :»
Lire x
Si x ≥ 0 Alors
val_abs ← x
Sinon
val_abs ← −x.
Fin Si
Fin.
Dans la première forme, on peut enchaîner autant d’instructions Sinon Si que désiré : seule la
première dont la condition sera vérifiée sera exécutée. On peut généralement associer une clause Sinon
qui ne sera exécutée que si aucune clause Sinon si n’a été vérifiée.
Exemple 2.13. Considérons un algorithme qui demande à l’utilisateur l’âge de l’enfant, puis détermine
la catégorie de l’enfant :
Var age en chaîne des caractères
31
Début
Afficher «Entrez l’âge de l’enfant :»
Lire age
Si age ≥ 12 Alors
Afficher «Catégorie Cadet»
Sinon Si age ≥ 10 Alors
Afficher «Catégorie Minime»
Sinon Si age ≥ 8 Alors
Afficher «Catégorie Pupille»
Sinon Si age ≥ 6 Alors
Afficher «Catégorie Poussin»
Sinon
Afficher «Erreur»
Fin Si
Fin Si
Fin Si
Fin Si
Fin.
La deuxième forme consiste à sélectionner le bloc à exécuter en fonction de la valeur d’une variable.
Cette forme est utilisée lorsqu’un aiguillage offre plusieurs sorties, et qu’une condition doit être testée
plusieurs fois, en utilisant toujours la même variable.
32
Fin.
Structurellement, cela équivaut à une succession de Sinon Si, mais savoir que la valeur de la
variable testée ne changera pas lors de l’évaluation des conditions permet au traducteur de faire
quelques optimisations.
Il existe plusieurs types de structures itératives, selon que le nombre de répétitions (ou d’itérations)
est prédéterminé ou non.
Répéter
s
Jusqu’à (ce que) p
Cette boucle permet de réitérer une instruction ou une suite d’instructions s jusqu’à ce qu’une
condition, appelée condition de sortie soit vérifiée. La suite d’instructions est exécutée au moins une
fois, quelle que soit la condition.
Var x, i en entier
Début
i←0
Répéter
Afficher «Entrez le nombre S.V.P.»
Lire x
i←i+1
Jusqu’à ce que x = 1524
Afficher «Vous avez trouvé le nombre.»
Afficher «Le nombre de vos tentatives est : » ; i
Fin.
33
La variable entière i dont la valeur initiale est 0 contient le nombre de fois que l’instruction Lire x
a été répété, une telle variable sera appelée compteur (de boucle), à chaque itération sa valeur aug-
mentera d’une quantité constante. On dira que le compteur est incrémenté.
La valeur constante avec laquelle le compteur augmente à chaque itération sera appelée pas d’in-
crémentation. Dans l’exemple 2.15, le pas d’incrémentation est 1. Lorsque la valeur de la variable de
contrôle décroît constamment d’une itération à l’autre, on l’appelle le décrément du compteur. On
parle aussi de pas de décrémentation.
Ainsi, un compteur est une variable qui contrôle les itérations d’une boucle. Il est ainsi nommé
parce que la plupart des utilisations de cette variable font que la variable prend une plage de valeurs
entières dans une séquence ordonnée. Étant donné que le compteur est une variable, il peut être nommé
à l’aide des conventions de dénomination des variables. Cependant, la dénomination d’identifiant
commun consiste pour le compteur de boucle à utiliser les noms de variable i, j et k (et ainsi de suite
si nécessaire). L’ordre inverse est également utilisé par certains programmeurs. Cette pratique remonte
à la notation mathématique où les indices pour les sommes et les multiplications sont souvent i, j, etc.
Tant que p
s
Fin Tant que
Si la condition p est vérifiée, la suite d’instructions s est exécutée, puis à la fin du bloc on évalue
à nouveau p et on recommence. Lorsque p renvoie un résultat faux, on quitte la boucle. Le prédicat p
est généralement appelé condition de continuation car le flux d’exécution continue avec s lorsque le p
est vrai.
Var x, i en entier
Début
i←1
Tantque n ̸= 1524
Afficher «Entrez le nombre S.V.P.»
Lire x
i←i+1
Fin tant que
Afficher «Vous avez trouvé le nombre.»
Afficher «Le nombre de vos tentatives est : » ; i
Fin.
34
B. Cas du nombre de répétitions prédéterminé : boucle «Pour»
Supposons que nous voulions écrire un algorithme nous permettant de multiplier un nombre donné
a par 11 en utilisant uniquement l’addition comme opérateur arithmétique. Il s’agira de trouver trou-
ver P = a + a + a + a + a + a + a + a + a + a + a
Var P, a en entier
Début
Afficher «Entrez le nombre à multiplier par 11 :»
Lire a
Pour i ← 1 à 11
P ←P +a
Fin Pour
Afficher «Le produit est : » ; P
Fin.
Cette version d’algorithme montre que, lorsque le nombre de répétitions est connu en avance, la
boucle «Pour» est plus efficace que les deux premiers. D’ailleurs, contrairement à la boucle «Tant
que» ou la boucle «Jusqu’à (ce que)», la boucle Pour inclut une variable appelée compteur (et son
initialisation d’ailleurs) dans sa syntaxe. Dans une boucle «Pour», la progression du compteur est
laissée à sa libre disposition. Dans la plupart des cas, nous avons besoin d’une variable qui augmente
de 1 à chaque itération, et généralement on ne spécifie rien sur le pas d’incrémentation. Si par contre
le pas est différent de 1, il suffit de préciser, avec l’instruction pas k, où k est le pas d’incrémentation
(ou de décrémentation).
Exemple 2.17. Considérons un algorithme qui affiche les 3000 premiers multiples de 3 sans faire des
multiplications.
Var i en entier
Début
Pour i ← 3 à 3003 (pas 3)
i
Fin Pour
35
C. Cas général
Les langages de programmation tels que C et le Common LISP permettent d’utiliser des structures
itératives plus générales que celles exprimées plus. Son format général est le suivant :
Itérer
a
Sortir Si p
b
Fin Itérer
Il est possible pour un problème, d’utiliser soit une structure alternative, soit une boucle pour, soit
une boucle «Tantque» ou encore une boucle «Jusqu’à (ce que)». Considérons un problème consistant
36
à écrire un algorithme qui affiche les vingt premiers nombre entiers positifs. Ce problème peut être
résolu par l’algorithme suivant :
Var i en entier
Début
Pour i ← 1 à 20
Afficher i
Fin Pour
Fin.
Avec la structure alternative simple, le même algorithme peut s’écrire de la manière suivante :
Var i en entier
Début
i←0
5. i ← i + 1
Si i < 20 Alors
Afficher i
Aller à 5
Fin Si
Fin.
Cependant, l’utilisation de la structure alternative dans les tâches répétitives nécessite l’utilisa-
tion de la commande Aller à déclaration. Signalons que l’instruction Aller à est de plus en plus
obsolète et de moins en moins accessible dans certains langages de programmation de haut niveau. En
effet, le langage de programmation comme Ruby, depuis la version 1.9, a l’instruction Aller à seule-
ment sous forme de plaisanterie : les instructions __goto__ et __label__ sont activées si la variable
SUPPORT_JOKE est définie lors de la compilation de Ruby. En 1966, le théorème de Böhm-Jacopini
(Böhm and Jacopini (1966) ; Ramshaw (1988)) a démontré que tout programme avec des Aller à
pouvait être transformé en un programme n’utilisant que des sous-programmes, des séquences, des
structures alternatives et des structures itératives.
Avec la boucle «Tant que», le même algorithme peut s’écrire de la manière suivante :
Var i en entier
Début
i←0
Tant que i < 20
i←i+1
Afficher i
Fin tant que Fin.
Avec la boucle «Jusqu’à (ce que)», le même algorithme peut s’écrire de la manière suivante :
Var i en entier
Début
i←0
Répéter
i←i+1
Afficher i
37
Jusqu’à ce que i ≥ 20
Fin.
Le seul intérêt de la boucle «Pour» par rapport à la boucle «Tant que» ou à la boucle «Jusqu’à (ce
que)» est d’épargner un peu de fatigue au programmeur, en lui évitant de gérer lui-même l’avancement
de la variable qui lui sert de compteur (Darmangeat (2008)).
In [1]: a = 4
b = 50.8
c = " 100 "
Dans l’exemple 3.1, les variables a, b et c reçoivent respectivement les valeurs 4, 50.8 et "100".
Exemple 3.2.
In [1]: d = e = 19
Ici, la valeur 19 est attribuée simultanément aux variables d et e.
• Les affectations parallèles à l’aide d’un seul opérateur.
Exemple 3.3.
En Python, il n’y a pas de constantes au sens strict. En effet, pour définir une constante en
Python, il est courant de nommer les constantes en majuscules pour indiquer qu’elles ne doivent pas
être modifiées, bien qu’elles ne soient pas réellement constantes dans le sens strict.
38
Exemple 3.4.
Exemple 3.5. On utilisera revenu_par_habitant pour exprimer le revenu par habitant et taux_de_change
pour exprimer le taux de chance lorsque nous programmons en Python.
Dans le langage Python, il existe des mots-clés spécifiques qui sont réservés et ont une signification
particulière. Vous pouvez consulter le Tableau 1 pour voir la liste complète de ces mots-clés utilisés
dans Python.
En Python, il n’y a pas de constantes au sens strict. En effet, pour définir une constante en
Python, il est courant de nommer les constantes en majuscules pour indiquer qu’elles ne doivent pas
être modifiées, bien qu’elles ne soient pas réellement constantes dans le sens strict.
Exemple 3.6.
Remarque 3.1. Il est à noter que l’utilisation de variables et de constantes peut varier selon les conven-
tions de programmation spécifiques et les besoins du programme. L’exemple ci-dessus illustrent les
approches couramment utilisées, mais il est important de comprendre que les variables peuvent être
modifiées et que les constantes ne sont pas strictement immuables dans Python.
39
3.1.2 Types des données
On distingue :
3.1.3 Transtypage
On peut passer d’un type d’objet à un autre. Dans ce moment, on doit utiliser une technique qu’on
appel transtypage ou conversion de type.
En Python, le transtypage est souvent implicite, ce qui signifie que Python convertira automati-
quement les types de données si cela est nécessaire. En effet, si on additionne un entier et un réel,
Python convertira automatiquement l’entier en réel avant d’effectuer l’addition.
Remarque 3.2. Notons que pour connaître le type d’objet (de la variable) en Python, on utilise type().
5. La notion de fonction sera abordée plus bas.
40
3.2 Opérateurs et opérandes en Python
Les opérateurs (arithmétiques) applicables sur les variables numériques en Python sont :
Opérateur Python
Addition +
Soustraction -
Multiplication *
Division (réelle) /
Puissance **
Modulo (Reste de la division entière) %
Division entière //
Opérateur Python
Négation (NON logique) not
Conjonction (ET) and
Disjonction (OU logique) or
Disjonction exclusive ˆ
Opérateur Python
Égal (=) ==
Différent (̸=) !=
Supérieur (>) >
Inférieur (<) <
Supérieur ou égal (≥) >=
Inférieur ou égal (≤) <=
41
In [7]: 4.8 ** 3 # La puissance
Out [7]: 11 0. 59 19 99 99 999 99 8
In [8]: 5 % 3 # Le modulo
Out [8]: 2
Remarque 3.3 (Opérations illicites). Il est important de souligner qu’en Python, certaines opérations
sont considérées comme illicites, ce qui signifie qu’elles sont incorrectes ou invalides selon les règles
de syntaxe et de sémantique du langage. Par conséquent, ces opérations ne peuvent pas être exécutées
correctement et entraîneront une erreur lors de leur exécution. Voici quelques exemples d’opérations
illicites en Python :
• La division par zéro, qui génère l’erreur ZeroDivisionError ;
• La conversion de types incorrecte, lorsqu’on effectue des opérations entre des types de données
incompatibles (comme les opérations les numériques et les chaînes de caractères). L’erreur gé-
nérée est TypeError ;
• Le dépassement de capacité, lorsqu’on effectue des calculs qui dépassent la capacité maximale
d’un type numérique, qui génère l’erreur OverflowError.
In [3]: 4/0
------------------------------------------------------------
Zer oDivis ionErr or Traceback ( most recent call last )
< ipython - input -4 -221068 dc2815 > in < module >
----> 1 4/0
In [4]: 0/0
42
------------------------------------------------------------
Zer oDivis ionErr or Traceback ( most recent call last )
< ipython - input -4 -221068 dc2815 > in < module >
----> 1 0/0
TypeError : can only concatenate str ( not " int " ) to str
Lire x
où x est l’identificateur de la donnée auquel on doit attribuer une valeur tapée au clavier. En Python,
ce format peut se traduire par :
x = input().
Python donne également la possibilité de demander à l’utilisateur d’entrer ses propres valeurs à
partir du clavier. Pour cela, la syntaxe utilisée est la suivante :
nom_variable = input("msg")
où "msg" est le message d’attente optionnel qui indique à l’utilisateur ce qu’il doit entrer.
Exemple 3.15. Le script Python ci-après demande à l’utilisateur d’entrer son nom :
print(info).
Exemple 3.16. Le programme Hello, world ! de l’exemple 2.7 s’implémente en Python de la manière
suivante :
43
In [1]: print ( " Salut , le monde ! " )
Salut , le monde !
Dans Python, l’affichage en utilisant print ne fonctionne que dans un environnement interactif
tel que l’interpréteur Python ou un notebook Jupyter. En particulier, pour afficher une variable à
l’écran, on utilise soit l’identificateur de la variable, soit le format print(x), avec x l’indentifieur de
la variable. Lorsque ce dernier est utilisée, la sortie sera affichée dans une cellule précédé d’un «Out».
On peut l’observé dans la figure 1.
Cette méthode peut être pratique pour une sortie rapide sans utiliser print(). Cependant, si on
souhaite afficher plusieurs valeurs ou ajouter du texte à votre sortie, print() doit être utilisé. De
plus, si on souhaite afficher une valeur spécifique à un moment précis dans le code, print() doit être
également utilisé.
Exemple 3.17. Reprenons l’illustration du point 2.1.1, avec le calcul de la moyenne arithmétique de
deux nombres. Nous avons l’implémentation en Python de la Figure 2
44
Dans le script précédent, l’instruction input() est utilisée pour recevoir une entrée sous forme
de chaîne de caractères. Cependant, pour effectuer des calculs arithmétiques, nous devons convertir
ces chaînes de caractères en nombres réels à l’aide de float(x1) et float(x2). Ainsi, l’instruction
combine ces deux étapes en une seule pour faciliter la conversion des entrées de l’utilisateur au type
souhaité :
nom_variable = type_cible(input(["msg"])
où type_cible est le type ciblé, différent de chr, de la variable nom_variable.
Pour afficher les contenus des variables en les insérant dans une chaîne de caractères, il existe au
moins deux méthodes couramment utilisées : (i) l’écriture avec un affichage simple et (ii) l’écriture
avec un affichage formaté. Ces deux approches sont illustrées respectivement dans les exemples de
code présentés dans les Figures 10 et 5.
45
Figure 4 – Calcul de la moyenne de deux nombres et affichage en insérant les valeurs des
variables en écriture sans formattage.
Figure 5 – Calcul de la moyenne de deux nombres et affichage en insérant les valeurs des
variables en écriture formatée.
46
3.4 Structures de contrôle dans Python
3.4.1 Structures alternatives
La première forme de la structure conditionnelle simple :
if p :
s
où p est la condition et s la suite d’instructions à exécuter si la condition est satisfaite.
if x >= 0:
val_abs = x
else :
val_abs = -x
if p1 :
s1
elif p2 :
s2
[...]
elif pn :
sn
else :
t
Cette structure peut s’expliquer de la manière suivante :
• L’instruction if p1: vérifie la condition p1. Si la condition p1 est satisfaite, la suite d’ins-
tructions s1 qui suit sera exécuté. Si la condition p1 n’est satisfaite, le programme passe à
l’instruction elif.
• L’instruction elif p2: permet de vérifier une deuxième condition, p2. Si la condition p2 est
satisfaite et que les conditions précédentes (p1) sont ne sont pas satisfaites, la suite d’instructions
s2 sera exécuté. Si la condition p2 est n’est pas verifiée, le programme passe à l’instruction elif
suivante, s’il y en a.
• Les instructions elif peuvent être répétées autant de fois que nécessaire avec des conditions
différentes (p3, p4, ..., pn). Chaque instruction elif permet tester une condition supplé-
mentaire. Si une des conditions pi est satisfaite, la suite d’instructions si correspondant sera
exécuté et les autres clauses elif et le bloc else seront ignorés.
47
• L’instruction else: est facultative. Elle est utilisée lorsque toutes les conditions précédentes
(p1, p2, ..., pn) sont évaluées ne sont pas satisfaites. La suite d’instructions t qui suit sera
exécuté si aucune des conditions précédentes n’est satisfaite.
Étant donné que la fonction input() ne récupère que des chaînes de caractères, il est nécessaire
de s’assurer que tous les caractères entrés sont des chiffres. Pour ce faire, nous pouvons utiliser la
méthode isdigit() qui permet de vérifier si une chaîne de caractères est composée uniquement de
chiffres.
6. En programmation, l’imbrication fait référence à l’utilisation de structures de contrôle (telles que des
boucles et des structures conditionnelles) à l’intérieur d’autres structures de contrôle. Cela signifie qu’une struc-
ture de contrôle peut être placée à l’intérieur d’une autre structure de contrôle, créant ainsi une hiérarchie ou
une superposition de blocs de code.
48
Parmi les méthodes disponibles pour effectuer des vérifications sur des chaînes de caractères, on
a : isdigit(), isnumeric(), isdecimal() et isalnum().
• isdigit() : Cette méthode vérifie si tous les caractères d’une chaîne sont des chiffres.
• isnumeric() : Cette méthode est similaire à isdigit(), mais elle accepte également d’autres types
de caractères numériques tels que les chiffres en exposant, les fractions et les chiffres en langue
étrangère.
• isdecimal() : Cette méthode vérifie si tous les caractères d’une chaîne sont des chiffres décimaux
(base 10).
• isalnum() : Cette méthode vérifie si tous les caractères d’une chaîne sont alphanumériques,
c’est-à-dire des lettres ou des chiffres.
Exemple 3.24. La Figure 6 illustre l’utilisation de ces méthodoes.
Python n’a pas de structure spécifique appelée «Selon Cas». Cependant, Python offre une alter-
native avec la structure généralisée avec des Si ... Alors ... Sinon ... Fin Si, qui peut être
utilisée pour gérer des conditions multiples de manière similaire à « Selon Cas ».
Exemple 3.25. L’exemple 2.14 dans la Figure 7 montre une implémentation de cette structure en
Python.
Exemple 3.26. L’exemple 2.16 peut être implémentée en Python de la manière suivante :
In [1]: x = 0
i = 1
while x != 1524:
print ( " Entrez le nombre S . V . P . " )
x = int ( input () )
i += 1
49
Figure 6 – Illustration de l’utilisation des méthodes de vérification des chaînes de caractères.
50
Figure 7 – Une impémentation de l’exemple 2.14.
Exemple 3.27. L’exemple 2.15 peut être implémentée en Python de la manière suivante :
In [1]: x , i = 0 , 0
while x != 1524:
print ( " Entrez le nombre S . V . P . " )
x = int ( input () )
i += 1
Exemple 3.28. En reprénant l’affichage des 3000 premiers multiples de 3 sans faire des multiplications.
# Declaration de la variable i
i = 3
51
# Boucle pour afficher les multiples de 3
for i in range (3 , 3004 , 3) :
print ( i )
> a <- 4
> 50.8 -> b
> c = " 100 "
Il est important de noter la position de l’identificateur de la variable et de sa valeur. Lorsque nous
utilisons l’opérateur « -> », la valeur est à gauche de l’opérateur et l’identificateur est à droite.
De plus, il est recommandé d’éviter d’utiliser l’opérateur « = » pour affecter une valeur à une
variable. Cette pratique peut prêter à confusion avec les constructions « symbole = valeur » dans les
appels de fonction. Les règles de syntaxe de R indiquent d’utiliser les opérateurs « <- » ou « ->» pour
l’affectation.
Exemple 4.2.
> d <- 19
> e <- " Gloria "
> f <- " Maelys "
52
Exemple 4.3. On utilisera revenuParHabitant pour exprimer le revenu par habitant et tauxDeChange
pour exprimer le taux de chance lorsque nous programmons en R.
R dispose également de certains mots-clés qui sont réservés et utilisés dans le langage. Vous pouvez
consulter le Tableau 5 pour voir la liste des mots-clés spécifiques à R.
En R, il n’y a pas de constantes au sens strict. En effet, pour définir une constante dans R, il est
courant d’utiliser la fonction const pour indiquer que la valeur ne doit pas être modifiée. Cependant,
il est important de noter que cette utilisation de const n’empêche pas strictement la modification
de la valeur. Au contraire, cela sert d’indice aux autres programmeurs que la valeur ne doit pas être
modifiée intentionnellement.
Exemple 4.4.
Remarque 4.1. Il est à noter que l’utilisation de variables et de constantes peut varier selon les conven-
tions de programmation spécifiques et les besoins du programme. L’exemple ci-dessus illustrent les
approches couramment utilisées, mais il est important de comprendre que, comme dans Python, les
variables peuvent être modifiées et que les constantes ne sont pas strictement immuables dans R.
53
Exemple 4.8. "d", "5", "K" et " " sont des caractères.
• Le type chaîne de caractères, qui est formé par une juxtaposition des caractères.
Exemple 4.9. "Maelys", "007", "Tome 1" et "vibration" sont des chaînes de caractères.
Les types caractère et chaîne de caractères sont représentés par le mot-clé character.
• Le type booléen, qui a pour valeur TRUE ou FALSE (toutes les lettres en majuscules), que l’on
peut abréger avec T et F.
4.1.3 Transtypage
On peut passer d’un type d’objet à un autre. Dans ce moment, on doit utiliser une technique qu’on
appel transtypage ou conversion de type.
En R, le transtypage est souvent explicite, ce qui signifie qu’on doit spécifier explicitement le
type de données qu’on souhait convertir. De plus, R a une approche plus stricte en matière de transty-
page, ce qui signifie que les conversions de type peuvent échouer si les données ne sont pas compatibles.
Remarque 4.2. Notons que pour connaître le type d’objet (de la variable) en R, on utilise class().
54
4.2 Opérateurs et opérandes en R
Les opérateurs (arithmétiques) applicables sur les variables numériques en R sont :
Opérateur R
Addition +
Soustraction -
Multiplication *
Division (réelle) /
Puissance ˆ
Modulo %%
Division entière %/%
Opérateur R
Négation !
Conjonction &&
Disjonction ||
Disjonction exclusive xor()
55
> T || F # La disjonction ( inclusive )
[1] TRUE
> xor (T , F ) # La disjonction exclusive
[1] TRUE
Remarque 4.3 (Quelques valeurs particulières). Dans le langage R, la division par zéro et les divisions
par l’infini génèrent des résultats spécifiques régis par les règles de l’arithmétique des nombres réels.
Voici les résultats qu’on obtient dans R pour différentes divisions :
• Le résultat Inf ce qui signifie «Infinite» (en français «Infini»). Cela est représenté par le symbole
«Inf» ou «-Inf» (pour l’infini positif et négatif respectivement), lorsqu’on fait d’un nombre
quelconque par zéro.
• Le résultat NaN, ce qui signifie «Not a Number» (en français «Pas un nombre»), lorsqu’on fait
la division de zéro par zéro ou infini sur infini.
• Si on divise zéro par un nombre non nul (même s’il s’agit de l’infini), le résultat est toujours
zéro.
x <- readline()
56
où
x est l’identificateur de la donnée auquel on doit attribuer une valeur tapée au clavier.
R donne également la possibilité de demander à l’utilisateur d’entrer ses propres valeurs à partir
du clavier. Pour cela, la syntaxe utilisée est la suivante :
Exemple 4.14.
print(info).
Exemple 4.15. Le programme Hello, world ! de l’exemple 2.7 s’implémente en R de la manière suivante :
Remarque 4.4. Lorsque print(info), le résultat sera affiché avec l’indice de la ligne du résultat.
cat(info).
Exemple 4.16. Avec ce schéma, le programme Hello, world ! de l’exemple 2.7 s’implémente en R de la
manière suivante :
Remarque 4.5. Contrairement au schéma avec print(), lorsque cat(info), le résultat sera affiché
sans indice de la ligne du résultat.
Le troisième schéma est l’utilisation directe de info. Il peut s’agir du contenu d’une variable ou
d’une constante. Donc,
info.
57
Exemple 4.17. Le programme Hello, world ! de l’exemple 2.7 s’implémente en R de la manière suivante :
Remarque 4.6. Ici également, le résultat sera affiché avec l’indice de la ligne du résultat.
Comme avec Python, si on souhaite afficher plusieurs valeurs ou ajouter du texte à votre sortie,
print() doit être utilisé. De plus, si on souhaite afficher une valeur spécifique à un moment précis
dans le code, print() doit être également utilisé.
Exemple 4.18. Reprenons l’illustration du point 2.1.1, avec le calcul de la moyenne arithmétique de
deux nombres. Nous avons l’implémentation en R de la Figure 8
Dans le script précédent, l’instruction readline() est utilisée pour recevoir une entrée sous forme
de chaîne de caractères. Cependant, pour effectuer des calculs arithmétiques, nous devons convertir
ces chaînes de caractères en nombres réels à l’aide de [Link](x1) et [Link](x2). Ainsi,
l’instruction combine ces deux étapes en une seule pour faciliter la conversion des entrées de l’utilisateur
au type souhaité :
nomVariable = as.type_cible(readline(["msg"])
où type_cible est le type ciblé, différent de character, de la variable nomVariable.
Exemple 4.19. La Figure 9 illustre bien le changement apporté au programme de la Figure ??.
Pour afficher les contenus des variables en les insérant dans une chaîne de caractères, il existe deux
méthodes couramment utilisées : (i) l’écriture avec un affichage simple et (ii) l’écriture avec un affichage
formaté. Ces deux approches sont illustrées respectivement dans les exemples de code présentés dans
les Figures 10 et 5.
58
Figure 9 – Calcul de la moyenne de deux nombres avec R, deuxième version.
Figure 10 – Calcul de la moyenne de deux nombres et affichage en insérant les valeurs des
variables en écriture sans formattage.
59
Dans le script de la Figure 10 , nous avons utilisé des variables dans le message affiché en les
séparant par virgules (,) comme nous le ferions avec Python. Cependant, la valeur affichée comporte
trois décimales après la virgule, ce qui est le nombre de décimales par défaut.
Figure 11 – Calcul de la moyenne de deux nombres et affichage en insérant les valeurs des
variables en écriture formatée.
Dans ce script, nous avons utilisé l’instruction sprintf et les spécificateurs de format pour for-
mater les valeurs selon différents critères. Ces spécificateurs de format peuvent être combinés avec des
options supplémentaires pour contrôler la largeur du champ, le remplissage, l’alignement, etc. Voici
quelques cas d’autres spécificateurs de format couramment utilisés :
60
où p est la condition et s la suite d’instructions à exécuter si la condition est satisfaite.
if ( p ) {
s
} else {
t
}
if ( x >= 0) {
val_abs <- x
} else {
val_abs <- -x
}
if ( p1 ) {
s1
} else if ( p2 ) {
s2
} else if ( p3 ) {
s3
}
[...]
else {
t
}
61
cat ( " Categorie Minime " )
} else if ( as . integer ( age ) >= 8) {
cat ( " Categorie Pupille " )
} else if ( as . integer ( age ) >= 6) {
cat ( " Categorie Poussin " )
} else {
cat ( " Erreur " )
}
Les structures alternatives «Selon» sont conçues en R avec la fonction switch. Son format général
est le suivant :
switch ( expr ,
cas1 = p1 ,
cas1 = p1 ,
[...]
casn = pn
default = pDefaut )
La structure commence par évaluer l’expression expr. Si le résultat est une valeur numérique k,
alors la suite d’instructions tk est exécutée. En revanche, si le résultat de expr correspond à l’une des
chaînes de caractères cas1, cas2, ..., alors la suite d’instructions correspondante est exécutée.
Exemple 4.24. L’exemple 2.14 dans la Figure 12 montre une implémentation de cette structure en R.
62
Figure 12 – Une impémentation de l’exemple 2.14.
63
4.4.2 Structures itératives
En R, la boucle «Tant que» est implémenter de la manière suivante :
while ( p ) {
s
}
avec s une suite d’instructions et p le prédicat de contrôle de l’itération.
Exemple 4.25. L’exemple 2.16 peut être implémentée en Python de la manière suivante :
x <- 0
i <- 1
while ( x != 1524) {
cat ( " Entrez le nombre S . V . P .\ n " )
x <- as . integer ( readline () )
i <- i + 1
}
x <- 0
i <- 0
repeat {
cat ( " Entrez le nombre S . V . P .\ n " )
x <- as . integer ( readline () )
i <- i + 1
if ( x == 1524) {
break
}
}
64
for ( i in 1: n ) {
s
}
ou
for ( i in seq (1 , n , k ) ) {
s
}
si le pas d’incrémentation est différent de 1. Avec s une suite d’instructions à exécuter.
Exemple 4.27. En reprénant l’affichage des 3000 premiers multiples de 3 sans faire des multiplications.
# Declaration de la variable i
i <- 3
65
Table 10 – Comparaison des opérateurs de comparaison.
Pseudo-code Python R
Si p Alors if p : if ( p ) {
s. s s
Fin Si }
Si p Alors if p : if ( p ) {
s s s
Sinon else : } else {
t. t t
Fin Si }
66
Table 14 – Structures répétitives.
Pseudo-code Python R
Pseudo-code Python R
67
6 Conclusion
L’objectif de cet papier était de présenter de manière simple les principales structures de données
primitives et les structures de contrôle en Python et R.
Python et R sont des langages de programmation qui fournissent des structures de données pri-
mitives, telles que les variables et les constantes, pour représenter des entiers, des booléens, des réels,
des caractères et des nombres complexes. Ces deux langages offrent la possibilité d’effectuer des opé-
rations mathématiques, des comparaisons et des opérations logiques sur ces types de données de base.
Néanmoins, il est important de souligner qu’il existe des distinctions significatives entre Python et R
dans la manière dont ils gèrent ces structures de données.
Python se distingue par sa syntaxe claire et lisible, qui facilite la manipulation des types de don-
nées primitifs. Il offre également des fonctionnalités avancées pour convertir et manipuler des chaînes
de caractères. En revanche, R est spécifiquement conçu pour l’analyse statistique et possède des fonc-
tionnalités plus puissantes pour travailler avec des vecteurs et des tableaux de données. R propose
des opérations vectorisées qui simplifient les calculs et les transformations sur les jeux de données.
De plus, en ce qui concerne les nombres complexes, Python et R prennent en charge les opérations
mathématiques sur ces nombres, mais R offre des fonctionnalités plus avancées pour les calculs et les
manipulations de nombres complexes grâce à sa prise en charge native de ce type de données.
Nous avons également couvert les structures de contrôle telles que les structures séquentielles, les
structures alternatives et les structures en boucle. Nous avons observé que Python et R utilisent des
structures de contrôle très similaires, mais la syntaxe de Python est plus lisible et moins verbeuse
que celle de R. En revanche, R privilégie une syntaxe adaptée au traitement de grandes quantités
de données. De plus, R propose des structures spécifiques telles que switch...case ou until, que
Python ne propose pas nativement, mais qui peuvent être facilement adaptées.
Dans notre prochain papier, nous présenterons des structures de contrôle avancées appelées sous-
algorithmes, qui structurent davantage le code et le rendent plus modulaire et réutilisable.
68
Références
Böhm, C. and Jacopini, G. (1966). Flow diagrams, turing machines and languages with only two
formation rules. Communications of the ACM, 9(5) :366–371.
Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. (2022). Introduction to Algorithms. MIT
Press and McGraw-Hill, 4th edition.
Darmangeat, C. (2008). Algorithme et Programmation pour les non-matheux. Cours complet avec
exercices, corrigés et citations philosophiques. Université Paris 7.
Goodrich, M. T., Tamassia, I. R., and Goldwasser, M. H. (2013). Data Structures and Algorithms in
Python. John Wiley & Sons, New York.
Prakash, Dr. PKS and Rao, Achyutuni Sri Krishna (2016). R Data Structures and Algorithms. Packt
Publishing, Birmingham.
Ramshaw, L. (1988). Eliminating go to’s while preserving program structure. Journal of the ACM,,
35(4) :893–920.
Sedgewick, R. and Wayne, K. (2011). Algorithms. Princeton University Press, Princeton, 4th edition.
Venables, W. N., Smith, D. M., and R Core Team (2023). An Introduction to R, Notes on R : A
Programming Environment for Data Analysis and Graphics. Version 4.3.0.
69