Как я могу вычислить двойные факториалы в Perl? - PullRequest
2 голосов
/ 06 января 2009

Учитывая обсуждение в Википедии Двойного факториала s, кто-нибудь может подсказать, где я могу найти bignum версию этого для Perl, или кто-нибудь другой, как это может быть написано?

Ответы [ 5 ]

3 голосов
/ 06 января 2009

Perl будет обрабатывать все, что может обработать ваш компилятор C, для всего, что вы должны использовать Math :: BigInt .

Я бы рекомендовал вам прочитать perlnumber .

Определение для двойного факториала (в Perl Golf):

sub f{$_[0]&&$_[0]>=2?$_[0]*f($_[0]-2):1}
2 голосов
/ 07 января 2009

Вот много альтернативных подходов к реализации быстрых факторных функций . Алгоритм Бедного Человека может быть хорошим выбором для вас, так как он не использует библиотеку Big-Integer и может быть легко реализован на любом языке компьютера и даже быстр до 10000 !.

Перевод на Perl оставлен в качестве упражнения для ОП: -)

1 голос
/ 08 января 2009

Хотя ответ DSM точен, реальный способ расчета факториалов в Perl, независимо от того, используете ли вы алгоритм DSM (в гольфе или нет), равен memoize Это. Если вы собираетесь вызывать его с любой частотой, вы захотите запомнить любую рекурсивную математическую функцию.

use Memoize;
memoize( 'fact2' );

sub fact2 {$_[0]&&$_[0]>=2?$_[0]*fact2($_[0]-2):1}
1 голос
/ 07 января 2009

Perl 5.8 и более поздние версии поставляются с пакетом bignum . Просто используйте его в своем сценарии, и он позаботится обо всем остальном:

use bignum;

Я немного об этом говорю в Мастеринг Perl , когда использую факториал в главе "Профилирование".

0 голосов
/ 06 января 2009

Если вы выполняете вычисления с плавающей запятой с (двойными) факториалами, вы можете быстро попасть в ситуации переполнения или переполнения. Обычно лучше всего работать с логарифмами. Сложение и вычитание логарифмов факториалов с последующим взятием экспоненты в конце более надежно, чем умножение и деление факториалов напрямую. Подробнее здесь .

...