Руби факториальная функция - PullRequest
84 голосов
/ 12 марта 2010

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

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

Ответы [ 19 ]

131 голосов
/ 12 марта 2010

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

101 голосов
/ 14 сентября 2012

Как это лучше

(1..n).inject(:*) || 1
77 голосов
/ 12 марта 2010

Его нет в стандартной библиотеке, но вы можете расширить класс 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. Итеративный факториал - лучший выбор по очевидным причинам производительности.

22 голосов
/ 11 мая 2012

Бесстыдно вымогал от http://rosettacode.org/wiki/Factorial#Ruby, мой личный фаворит

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

>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Эта реализация также оказывается самой быстрой среди вариантов, перечисленных в Rosetta Code.

обновление # 1

Добавлено || 1 для обработки нулевого регистра.

обновление # 2

С благодарностью и благодарностью Марк Томас , вот версия, которая немного более эффективна, элегантна и неясна:

class Integer
  def fact
    (2..self).reduce(1,:*)
  end
end
13 голосов
/ 02 января 2012

Вы также можете использовать функцию Math.gamma, которая сводится к факториалу для целочисленных параметров.

12 голосов
/ 18 февраля 2016
class Integer
  def !
    (1..self).inject(:*)
  end
end

примеры

!3  # => 6
!4  # => 24
12 голосов
/ 20 мая 2016

В математике factorial of n это просто gamma function of n+1
(см .: http://en.wikipedia.org/wiki/Gamma_function)

В Ruby есть Math.gamma(), поэтому просто используйте Math.gamma(n+1) и приведите его к целому числу, если хотите.

8 голосов
/ 27 апреля 2014

Я бы сделал

(1..n).inject(1, :*)
6 голосов
/ 14 марта 2012

Я просто написал свой собственный:

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
3 голосов
/ 10 января 2014

Использование Math.gamma.floor - это простой способ получить аппроксимацию и затем округлить ее обратно до правильного целочисленного результата. Должно работать для всех целых чисел, при необходимости включите проверку ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...