Ruby因子函数

rut*_*ger 85 ruby math factorial

我疯了:因子的Ruby函数在哪里?不,我不需要教程实现,我只想要库中的函数.这不是数学!

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

sep*_*p2k 133

标准库中没有因子函数.

  • Ruby有`Math.gamma`方法,例如/sf/answers/2614688331/ (7认同)
  • 多么疯狂的逻辑!我们有(n-1)!功能,没有简单的 n!!!! (2认同)

Ale*_*sky 102

喜欢这样比较好

(1..n).inject(:*) || 1
Run Code Online (Sandbox Code Playgroud)

  • 或者直接指定初始值:`(1..n).reduce(1,:*)`. (32认同)

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由于明显的性能原因,迭代因子是更好的选择.

  • 他可能不会; 但搜索SO"Ruby factorial"的人可能. (115认同)
  • 他明确表示,他不想要实施. (7认同)
  • 另一个实现:http://rosettacode.org/wiki/Factorial#Ruby (3认同)

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

添加|| 1处理零情况.

更新#2

感谢Mark Thomas,这是一个更有效,优雅和模糊的版本:

class Integer
  def fact
    (2..self).reduce(1,:*)
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @allen - 如果你无法理解,不要责怪这种语言.它只是意味着,将范围1转换为自我,然后从中移除第一个元素(1)(即函数编程中的减少意味着什么).然后删除左边的第一个元素(2)并将它们相乘(:*).现在从左边的第3个元素中删除第一个元素,然后将其乘以运行总计.继续前进,直到没有任何东西(即你已经处理了整个范围).如果reduce失败(因为在0的情况下数组为空!),那么只需返回1. (7认同)
  • 0也不正确! - 应该是这样的:如果自己<= 1; 1; 其他; (1..self).降低(:*); 结束 (3认同)
  • 实际上你可以使用`(2..self).reduce(1,:*)`,如果微效率是你的东西:) (3认同)

小智 14

您还可以使用Math.gamma归结为整数参数的阶乘的函数.

  • 从文档:"注意,对于整数n> 0,gamma(n)与事实(n-1)相同.但是,gamma(n)返回float并且可以是近似值".如果考虑到这一点,它可以工作,但减少解决方案似乎更直接. (3认同)
  • 注意:它是O(1)并且对于'0..22`是精确的:MRI Ruby实际上对这些值执行查找(参见[source]中的`static const double fact_table []`(http://www.ruby- doc.org/core-2.1.1/Math.html#method-c-lgamma)).除此之外,它是一个近似值.例如,23!需要一个56位的尾数,这是不可能精确地使用具有53位尾数的IEEE 754双精度表示的. (2认同)

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)

  • 我恭敬地建议覆盖所有Ruby对象中的[实例方法](https://ruby-doc.org/core-2.4.2/BasicObject.html#method-i-21)以返回真值,而不是一个虚假的人可能不会让你成为很多朋友. (3认同)

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)并将其强制转换为整数.


San*_*osh 8

我会做

(1..n).inject(1, :*)
Run Code Online (Sandbox Code Playgroud)


小智 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)


Ale*_*org 5

怀着对所有参与并花时间帮助我们的人的崇高敬意,我想分享我对此处列出的解决方案的基准。参数:

迭代次数 = 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)