Ruby的阶乘函数

我要疯了:Ruby的函数在哪里呢? 不,我不需要教程实现,我只是想从图书馆的function。 这不是math!

我开始怀疑,这是一个标准的库函数?

标准库中没有阶乘函数。

这样比较好

 (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 

NB由于显而易见的性能原因,迭代因子是更好的select。

无耻从http://rosettacode.org/wiki/Factorial#Ruby cribbed,我个人最喜欢的是

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

这个实现也恰好是Rosetta代码中列出的变种中最快的。

更新

新增|| 1 || 1来处理零情况。

您也可以使用Math.gamma函数归结为整数参数的因子。

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

例子

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

我只写了我自己的:

 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 

我会做

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

使用Math.gamma.floor是一种简单的方法来产生一个近似值,然后将其舍入到正确的整数结果。 应该适用于所有Integers,如果需要的话包括input检查。

只需调用这个函数

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

例子

 factorial(3) factorial(11) 

在math中, factorial of n仅仅gamma function of n+1gamma function of n+1
(见: http : //en.wikipedia.org/wiki/Gamma_function )

Ruby有Math.gamma()所以只要使用Math.gamma(n+1)并根据需要将其转换回整数。

您可能会发现有用的Ruby function请求 。 它包含一个包含演示Bash脚本的非平凡补丁 。 天真的循环和批处理中的解决scheme之间的速度差异可以达到100倍(100倍)。 全部用纯Ruby编写。

 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 

只是另一种方式来做到这一点,虽然它确实没有必要。

 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 

而另一种方式(=

 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 

这是我的irbtesting线,显示了每一步。

 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