« Programmation objet et géométrie/SmallTalk par l'exemple » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 16 :
 
<source lang="smalltalk">
factorial
self = 0
ifTrue: [^ 1].
self > 0
self > 0
ifTrue: [^ self * (self - 1) factorial].
self error: 'Not valid for negative integers'
</source>
 
Ce qui peut se traduire ainsi: On commence par tester si l'entier en question est nul. Si le test réussit (c'est-à-dire si le nombre est effectivement nul), on renvoie 1, ce qui signifie que la factorielle de 0 est 1 par définition. Puis on lance un nouveau test sur le signe de l'entier. Si le test réussit (c'est-à-dire si l'entier est positif) on renvoie le produit de l'entier par la factorielle de son prédécesseur. Sinon on envoie un message d'erreur rappelant que seuls les nombres positifs ont une factorielle. On constate que cet algorithme est récursif.
 
===PGCD===
 
Pour les petits entiers, ''SmallTalk'' utilise l'algorithme d'Euclide (la version avec les divisions) en affectant simultanément (avec '':='') le plus grand entier avec le plus petit et le plus petit avec le reste de la division euclidienne (l'opération est notée ''\\'' en SmallTalk):
 
<source lang="smalltalk">
gcd: t1
| t2 t3 |
t2 := self.
t3 := t1.
[t2 = 0]
whileFalse: [t2 := t3 \\ (t3 := t2)].
^ t3 abs
</source>
 
La syntaxe est donnée sur la première ligne, et est à lire ''pgcd avec t1''. Les traits verticaux de la deuxième ligne encadrent la liste des variables, il y en a donc 2 ici. Elles sont initialisées avec les deux entiers (''self'' et ''t1'') dont on veut le pgcd, puis on lance un test de nullité sur ''t2''. Tant que ce test échoue (c'est-à-dire tant que ''t2'' n'est pas nul), on remplace ''t2'' par le reste euclidien et ''t3'' par ''t2''. Puis (c'est-à-dire quand le test de nullité sur ''t2'' réussit) on renvoie la valeur absolue de ''t3''. On voit donc que SmallTalk sait calculer le pgcd de deux entiers relatifs.
 
===Conversion en fraction===
Ligne 33 ⟶ 50 :
^Fraction numerator: self denominator: 1
</source>
 
Pour convertir un entier en fraction, on considère son dénominateur comme égal à 1.
 
==Fractions==