Рубиновая факторная функция



Я схожу с ума: где функция Ruby для факториала? Нет, мне не нужны реализации учебника, мне просто нужна функция из библиотеки. Это не по математике!



Я начинаю сомневаться, это стандартная библиотечная функция?

506   17  

17 ответов:

в стандартной библиотеке нет факторной функции.

Как это лучше

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

Это не в стандартной библиотеке, но вы можете расширить класс 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
end

N. 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) и при желании вернуть его в целое число.

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

примеры

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

Я бы сделал

(1..n).inject(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

    Ничего не найдено.