Pregunta Función factorial Ruby


Me estoy volviendo loco: ¿Dónde está la función Ruby para factorial? No, no necesito implementaciones de tutoriales, solo quiero la función de la biblioteca. ¡No está en Matemáticas!

Estoy empezando a dudar, ¿es una función de biblioteca estándar?


73
2018-03-12 17:20


origen


Respuestas:


No hay función factorial en la biblioteca estándar.


123
2018-03-12 17:23



Me gusta esto es mejor

(1..n).inject(:*) || 1

91
2017-09-13 21:57



No está en la biblioteca estándar, pero puede ampliar la clase Entero.

class Integer
  def factorial_recursive
    self <= 1 ? 1 : self * (self - 1).factorial
  end
  def factorial_iterative
    f = 1; for i in 1..self; f *= i; end; f
  end
  alias :factorial :factorial_iterative
end

nótese bien Factorial iterativo es una mejor opción por razones obvias de rendimiento.


76
2018-03-12 17:23



Desvergonzadamente descifrado de http://rosettacode.org/wiki/Factorial#Ruby, mi favorito personal es

class Integer
  def fact
    (1..self).reduce(:*) || 1
  end
end

>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Esta implementación también es la más rápida entre las variantes enumeradas en el Código Rosetta.

actualizar

Adicional || 1 para manejar el caso cero.


20
2018-05-11 17:56



class Integer
  def !
    (1..self).inject(:*)
  end
end

ejemplos

!3  # => 6
!4  # => 24

12
2018-02-18 17:23



También podrías usar Math.gamma función que se reduce a factorial para parámetros enteros.


10
2018-01-02 11:54



yo lo haría

(1..n).inject(1, :*)

8
2018-04-27 16:24



En matemáticas, factorial of n es solo el gamma function of n+1
(ver: http://en.wikipedia.org/wiki/Gamma_function)

Ruby tiene Math.gamma() así que solo usa Math.gamma(n+1) y devolverlo a un número entero si lo desea.


8
2018-05-20 17:37