17 ответов:
Это не в стандартной библиотеке, но вы можете расширить класс integer.
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 endN. B. итерационный факториал является лучшим выбором по очевидным причинам производительности.
бесстыдно списали с http://rosettacode.org/wiki/Factorial#Ruby, мой личный фаворит
class Integer def fact (1..self).reduce(:*) || 1 end end >> 400.fact => 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000эта реализация также является самой быстрой среди вариантов, перечисленных в коде Rosetta.
обновление
добавил
|| 1для обработки нулевого случая.
вы также можете использовать
Math.gammaфункция, которая сводится к факториалу для целочисленных параметров.
в математике,
factorial of nпростоgamma function of n+1
(см.: http://en.wikipedia.org/wiki/Gamma_function)Рубин
Math.gamma()Так что просто используйтеMath.gamma(n+1)и при желании вернуть его в целое число.
Я только что написал свой собственный:
def fact(n) if n<= 1 1 else n * fact( n - 1 ) end endкроме того, вы можете определить падающий факториал:
def fall_fact(n,k) if k <= 0 1 else n*fall_fact(n - 1, k - 1) end end
С помощью
Math.gamma.floorЭто простой способ получить приближение, а затем округлить его обратно до правильного целочисленного результата. Должен работать для всех целых чисел, при необходимости включить проверку ввода.
просто вызовите эту функцию
def factorial(n=0) (1..n).inject(:*) endпримеры
factorial(3) factorial(11)
просто еще один способ сделать это, хотя это действительно не обязательно.
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
вы, вероятно, найдете Рубин запрос полезное. Он содержит нетривиальный патч Это включает в себя demo bash script. Разница в скорости между наивной петлей и решением, представленным в партии, может быть буквально 100x (сто раз). Написано все в чистом Рубине.
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
и еще один способ (=
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)
вот моя версия, кажется, ясно для меня, хотя это не так чисто.
def factorial(num) step = 0 (num - 1).times do (step += 1 ;num *= step) end return num endЭто была моя линия тестирования irb, которая показывала каждый шаг.
num = 8;step = 0;(num - 1).times do (step += 1 ;num *= step; puts num) end;num
еще один способ сделать это:
# fact(n) => Computes the Factorial of "n" = n! def fact(n) (1..n).inject(1) {|r,i| r*i }end fact(6) => 720
Comments