sep*_*p2k 133
标准库中没有因子函数.
Ale*_*sky 102
喜欢这样比较好
(1..n).inject(:*) || 1
Run Code Online (Sandbox Code Playgroud)
Pie*_*tte 77
它不在标准库中,但您可以扩展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
Run Code Online (Sandbox Code Playgroud)
NB由于明显的性能原因,迭代因子是更好的选择.
fea*_*ool 22
从http://rosettacode.org/wiki/Factorial#Ruby无耻地抄袭,我个人最喜欢的是
class Integer
def fact
(1..self).reduce(:*) || 1
end
end
>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
此实现也恰好是Rosetta Code中列出的变体中最快的.
添加|| 1
处理零情况.
感谢Mark Thomas,这是一个更有效,优雅和模糊的版本:
class Integer
def fact
(2..self).reduce(1,:*)
end
end
Run Code Online (Sandbox Code Playgroud)
小智 14
您还可以使用Math.gamma
归结为整数参数的阶乘的函数.
jas*_*ard 12
class Integer
def !
(1..self).inject(:*)
end
end
Run Code Online (Sandbox Code Playgroud)
!3 # => 6
!4 # => 24
Run Code Online (Sandbox Code Playgroud)
Alb*_*haw 12
在数学中,factorial of n
只是gamma function of n+1
(参见:http://en.wikipedia.org/wiki/Gamma_function)
如果需要,Ruby Math.gamma()
只需使用Math.gamma(n+1)
并将其强制转换为整数.
小智 6
我刚写了自己的:
def fact(n)
if n<= 1
1
else
n * fact( n - 1 )
end
end
Run Code Online (Sandbox Code Playgroud)
此外,您可以定义下降阶乘:
def fall_fact(n,k)
if k <= 0
1
else
n*fall_fact(n - 1, k - 1)
end
end
Run Code Online (Sandbox Code Playgroud)
怀着对所有参与并花时间帮助我们的人的崇高敬意,我想分享我对此处列出的解决方案的基准。参数:
迭代次数 = 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)
Run Code Online (Sandbox Code Playgroud)
对于 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)
Run Code Online (Sandbox Code Playgroud)