Apprendre Ruby en faisant des maths 5
Jusqu’ici on a écrit une méthode qui calcule les diviseurs d’un nombre et une seconde méthode qui calcule les diviseurs stricts. Notre objectif étant de lister les nombres amiables jusqu’à 10 000, il nous faut maintenant obtenir la somme des diviseurs stricts d’un nombre.
Il nous faut donc calculer la somme des nombres qui composent une liste.
Allons y, prenons une liste et plaçons la dans une variable nommée x
:
Nous avons déjà vu la méthode select
, qui sélectionne certains éléments
d’une liste ; nous allons voir maintenant la méthode reduce
, qui va réduire
les éléments d’une liste à un seul élément:
Contrairement à la méthode select
qui ne prenait qu’une seule variable
dans le bloc d’instruction, la méthode reduce
en prends ici deux:
sum
et int
. sum
joue le rôle d’un accumulateur et contient le résultat
qui sera retourné par la méthode. int
fait référence à l’élément de la
liste en cours de traitement, exactement comme avec select
. Pour chaque
élément de la liste x
, l’instruction sum + int
est exécutée.
On peut se demander quelle est la valeur initiale de sum
? Tout simplement
le premier élément de la liste. Et nous ne sommes pas limité aux nombres,
reduce
fonctionnera avec ce qu’on veut, par exemple des chaînes de
caractères:
Ruby permet aussi de simplifier l’écriture dans un cas trivial comme le notre:
En fait, reduce
ne prend pas obligatoirement un bloc. Ci-dessus,
reduce
prend
en argument un symbole: :+
. +
est le nom d’une méthode. Oui, +
est
bien une méthode:
Je ne vais pas parler plus des symboles aujourd’hui, sachez seulement que les deux écritures suivantes font la même chose mais que la seconde est plus dans l’esprit de Ruby:
Voilà, on est prêt à implémenter la méthode sum_of_proper_divisors
, ce
qui signifie en français «somme des diviseurs stricts»:
Comme la dernière fois, on se sert d’une méthode plus générale
(proper_divisors
) pour écrire une méthode plus spécifique.
À demain.