ruby math factorial

Función factorial Ruby



math (17)

Simplemente llame a esta función

def factorial(n=0) (1..n).inject(:*) end

ejemplos

factorial(3) factorial(11)

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?


Aquí está mi versión que parece ser clara para mí, aunque no es tan clara.

def factorial(num) step = 0 (num - 1).times do (step += 1 ;num *= step) end return num end

Esta era mi línea de prueba de IRB que mostraba cada paso.

num = 8;step = 0;(num - 1).times do (step += 1 ;num *= step; puts num) end;num


Descaradamente descifrado de rosettacode.org/wiki/Factorial#Ruby , mi favorito 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

Añadido || 1 || 1 para manejar la caja cero.


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

Ruby tiene Math.gamma() así que simplemente usa Math.gamma(n+1) y vuelve a un número entero si lo deseas.


Me gusta esto es mejor

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


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

NB factorial iterativo es una mejor opción por razones obvias de rendimiento.


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


Probablemente encuentre útil una solicitud de función de Ruby. Contiene un patch no trivial que incluye un script demo Bash . La diferencia de velocidad entre un bucle ingenuo y la solución presentada en el lote puede ser literalmente 100x (cien veces). Escrito todo en puro Ruby.


Solo otra forma de hacerlo, aunque realmente no es necesario.

class Factorial attr_reader :num def initialize(num) @num = num end def find_factorial (1..num).inject(:*) || 1 end end number = Factorial.new(8).find_factorial puts number


Solo una forma más de hacerlo:

# fact(n) => Computes the Factorial of "n" = n! def fact(n) (1..n).inject(1) {|r,i| r*i }end fact(6) => 720


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


Usar Math.gamma.floor es una manera fácil de producir una aproximación y luego redondearla de vuelta al resultado entero correcto. Debería funcionar para todos los enteros, incluya una verificación de entrada si es necesario.


Y aún otra manera (=

def factorial(number) number = number.to_i number_range = (number).downto(1).to_a factorial = number_range.inject(:*) puts "The factorial of #{number} is #{factorial}" end factorial(#number)


Yo solo escribí el mío:

def fact(n) if n<= 1 1 else n * fact( n - 1 ) end end

Además, puedes definir un factorial descendente:

def fall_fact(n,k) if k <= 0 1 else n*fall_fact(n - 1, k - 1) end end


yo lo haría

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


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

ejemplos

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


class Integer def factorial return self < 0 ? false : self==0 ? 1 : self.downto(1).inject(:*) #Not sure what other libraries say, but my understanding is that factorial of #anything less than 0 does not exist. end end