我要发疯了:因子的Ruby函数在哪里?不,我不需要教程实现,我只想要库中的函数。这不是数学!
我开始怀疑,这是一个标准的库函数吗?
答案 0 :(得分:131)
标准库中没有因子功能。
答案 1 :(得分:101)
喜欢这样更好
(1..n).inject(:*) || 1
答案 2 :(得分: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
N.B。出于明显的性能原因,迭代因子是更好的选择。
答案 3 :(得分:22)
来自http://rosettacode.org/wiki/Factorial#Ruby的无耻贿赂,我个人最喜欢的是
class Integer
def fact
(1..self).reduce(:*) || 1
end
end
>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
此实现也恰好是Rosetta Code中列出的变体中最快的。
添加了|| 1
来处理零案例。
感谢和感谢Mark Thomas,这是一个更高效,优雅和模糊的版本:
class Integer
def fact
(2..self).reduce(1,:*)
end
end
答案 4 :(得分:13)
您还可以使用Math.gamma
函数,该函数可归结为整数参数的阶乘。
答案 5 :(得分:12)
在数学方面,factorial of n
只是gamma function of n+1
(见:http://en.wikipedia.org/wiki/Gamma_function)
Ruby有Math.gamma()
所以只需使用Math.gamma(n+1)
并根据需要将其强制转换为整数。
答案 6 :(得分:12)
class Integer
def !
(1..self).inject(:*)
end
end
!3 # => 6
!4 # => 24
答案 7 :(得分:8)
我愿意
(1..n).inject(1, :*)
答案 8 :(得分:6)
我刚写了自己的:
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
答案 9 :(得分:3)
使用Math.gamma.floor
是一种简单的方法来生成近似值,然后将其向后舍入到正确的整数结果。应该适用于所有整数,必要时包括输入检查。
答案 10 :(得分:3)
factorial(3)
factorial(11)
{{1}}
答案 11 :(得分:1)
只是另一种方法,尽管它确实没有必要。
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
答案 12 :(得分:1)
您可能会发现Ruby feature request很有用。它包含一个包含patch的非平凡demo Bash script。原始循环与批次中呈现的解决方案之间的速度差异可以是100倍(百倍)。全部用纯Ruby编写。
答案 13 :(得分:0)
这是我的版本似乎很清楚,即使它不是那么干净。
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
答案 14 :(得分:0)
还有另一种方式(=
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)
答案 15 :(得分:0)
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
答案 16 :(得分:0)
还有一种方法可以做到:
# fact(n) => Computes the Factorial of "n" = n!
def fact(n) (1..n).inject(1) {|r,i| r*i }end
fact(6) => 720
答案 17 :(得分:0)
当为此目的有内置迭代器时,为什么标准库需要析因方法?它称为inset
。
不,您不需要使用递归,就像其他所有答案一样。
upto
相反,内置的迭代器upto可用于计算阶乘:
def fact(n)
n == 0 ? 1 : n * fact(n - 1)
end
答案 18 :(得分:0)
衷心感谢所有参与并花时间帮助我们的人,我在此分享我列出的解决方案的基准。 参数:
迭代次数= 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)