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

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

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

Ответы [ 19 ]

3 голосов
/ 03 ноября 2015

Просто вызовите эту функцию

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

примеры

factorial(3)
factorial(11)
1 голос
/ 16 декабря 2014

Вы, вероятно, найдете полезным запрос Ruby . Он содержит нетривиальный патч , который включает в себя демо-скрипт Bash . Разница в скорости между наивным циклом и решением, представленным в пакете, может быть буквально в 100 раз (сто крат). Написано все на чистом рубине.

1 голос
/ 07 июля 2014

Просто еще один способ сделать это, хотя это действительно не нужно.

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
0 голосов
/ 18 апреля 2019

С большим уважением ко всем, кто принимал участие и потратил свое время, чтобы помочь нам, я хотел бы поделиться своими оценками решений, перечисленных здесь. Params:

итерации = 1000

n = 6

                                     user     system      total        real
Math.gamma(n+1)                   0.000383   0.000106   0.000489 (  0.000487)
(1..n).inject(:*) || 1            0.003986   0.000000   0.003986 (  0.003987)
(1..n).reduce(1, :*)              0.003926   0.000000   0.003926 (  0.004023)
1.upto(n) {|x| factorial *= x }   0.003748   0.011734   0.015482 (  0.022795)

Для n = 10

  user     system      total        real
0.000378   0.000102   0.000480 (  0.000477)
0.004469   0.000007   0.004476 (  0.004491)
0.004532   0.000024   0.004556 (  0.005119)
0.027720   0.011211   0.038931 (  0.058309)
0 голосов
/ 22 марта 2019

Зачем стандартной библиотеке нужен факторный метод, если для этой цели есть встроенный итератор? Это называется upto.

Нет, вам не нужно использовать рекурсию, как показывают все эти другие ответы.

def fact(n)
  n == 0 ? 1 : n * fact(n - 1)
end  

Скорее, встроенный итератор upto можно использовать для вычисления факториалов:

factorial = 1
1.upto(10) {|x| factorial *= x }
factorial
 => 3628800
0 голосов
/ 26 августа 2017

Еще один способ сделать это:

# fact(n) => Computes the Factorial of "n" = n!

def fact(n) (1..n).inject(1) {|r,i| r*i }end

fact(6) => 720
0 голосов
/ 13 мая 2013
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
0 голосов
/ 24 ноября 2014

И еще один способ (=

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)
0 голосов
/ 05 января 2016

Вот моя версия кажется мне понятной, хотя она не так чиста.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...