Copié sans vergogne de http://rosettacode.org/wiki/Factorial#Ruby mon préféré est
class Integer
def fact
(1..self).reduce(:*) || 1
end
end
>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Cette implémentation se trouve également être la plus rapide parmi les variantes répertoriées dans Rosetta Code.
mise à jour #1
Ajouté || 1
pour traiter le cas zéro.
mise à jour n°2
Avec nos remerciements et notre reconnaissance à Mark Thomas Voici une version un peu plus efficace, élégante et obscure :
class Integer
def fact
(2..self).reduce(1,:*)
end
end
66 votes
Je le fais comme
6.downto(1).inject(:*)
46 votes
@mckeed : Ou
(1..6).inject(:*)
qui est un peu plus succinct.0 votes
@sepp2k : bien sûr, mais je préfère avoir le numéro sur lequel j'agis à l'avant pour plus de lisibilité.
8 votes
Pourquoi vous attendriez-vous à ce qu'il y en ait un ?
4 votes
Je me demande quel est le statut des bibliothèques de mathématiques et de sciences pour Ruby.
5 votes
Juste une remarque sur les exemples fournis utilisant l'injection.
(1..num).inject(:*)
échoue pour le cas oùnum == 0
.(1..(num.zero? ? 1 : num)).inject(:*)
donne la réponse correcte pour le cas 0 et retournenil
pour les paramètres négatifs.0 votes
@mckeed Le
n.downto(1).inject(:*)
devrait être la réponse (si vous n'oubliez pas de tenir compte de 0)3 votes
@GregS, pourquoi ne vous attendriez-vous pas à ce qu'il y en ait une ? Après tout, il s'agit de la bibliothèque mathématique standard de Ruby. C'est un peu triste, vraiment...
0 votes
Les maths ? Bah ! Pas en Ruby !