【问题标题】:How can I compute double factorials in Perl?如何在 Perl 中计算双阶乘?
【发布时间】:2009-01-06 12:45:11
【问题描述】:

鉴于 Wikipedia 对 Double Factorials 的讨论,谁能建议我在哪里可以找到 Perl 的 bignum 版本,或者建议如何编写它?

【问题讨论】:

    标签: perl bignum


    【解决方案1】:

    Perl 将处理您的 C 编译器可以处理的任何内容,对于更大的内容,您应该使用 Math::BigInt

    我建议你阅读perlnumber

    双阶乘的定义(在 perl golf 中):

    sub f{$_[0]&&$_[0]>=2?$_[0]*f($_[0]-2):1}
    

    【讨论】:

    • 我一直在使用 BigInt。问题是 BigInt 没有像双因子这样的东西。它有bfac,但这是一个不同的野兽。
    • 我以为你在追求一个足够大的数字来存储结果,而不是提供运算的数学库。
    • @boost:你可以很容易地为你写一个。
    • @H.P.Y.不想让生活变得/太/容易我确实提供了一个;)
    • 标量值@_[0] 在stackoverflow.com/questions/416377 中最好写成$_[0]。打高尔夫球很有趣,但打开警告打高尔夫球会更好。 ;)
    【解决方案2】:

    这里有很多实现Fast Factorial Functions 的替代方法。穷人算法对你来说可能是一个不错的选择,因为它不使用大整数库,并且可以很容易地用任何计算机语言实现,甚至可以快速达到 10000!。

    翻译成 Perl 留给 OP 练习 :-)

    【讨论】:

      【解决方案3】:

      Perl 5.8 及更高版本附带bignum 包。只需将它用于您的脚本,剩下的就交给它了:

      use bignum;
      

      当我在“Profiling”一章中使用阶乘时,我在Mastering Perl 中谈到了这一点。

      【讨论】:

        【解决方案4】:

        虽然 dsm 的答案是准确的,但在 Perl 中计算阶乘的真正方法,无论您是否使用 dsm 的算法(是否打高尔夫球)都是 memoize 它.如果要以任何频率调用它,则需要记住任何递归数学函数。

        use Memoize;
        memoize( 'fact2' );
        
        sub fact2 {$_[0]&&$_[0]>=2?$_[0]*fact2($_[0]-2):1}
        

        【讨论】:

        • 可能您想将其编辑为 sub fact2 {$_[0]&&$_[0]>=2?$_[0]*fact2($_[0]-2): 1}
        猜你喜欢
        • 2015-04-19
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2018-03-27
        • 2022-01-17
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多