鉴于维基百科对Double Factorial的讨论,有人可以建议我在哪里找到Perl的bignum版本,或者建议如何编写它?
答案 0 :(得分:3)
Perl将处理你的C编译器可以处理的任何内容,对于你应该使用Math::BigInt的更大的东西。
我建议你阅读perlnumber。
双因子(perl golf)的定义:
sub f{$_[0]&&$_[0]>=2?$_[0]*f($_[0]-2):1}
答案 1 :(得分:2)
以下是实施Fast Factorial Functions的许多替代方法。穷人的算法对你来说可能是一个不错的选择,因为它不使用Big-Integer库,可以用任何计算机语言轻松实现,甚至快达10000!
转换为Perl留作OP的练习: - )
答案 2 :(得分:1)
答案 3 :(得分:1)
虽然dsm的答案是准确的,但无论你是否使用dsm的算法(不管是否是高尔夫球),真实计算Perl中的阶乘的方法都是 memoize 它。如果您打算以任何频率调用它,您将需要记住任何递归数学函数。
use Memoize;
memoize( 'fact2' );
sub fact2 {$_[0]&&$_[0]>=2?$_[0]*fact2($_[0]-2):1}
答案 4 :(得分:0)
如果使用(双)阶乘进行浮点计算,则可以快速进入上溢或下溢情况。通常最好使用对数。增加和减去因子的对数然后在最后采用指数比直接乘法和除因子更可靠。更多详情here。