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