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

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

5 ответов

Решение

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

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

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

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

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

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

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

use bignum;

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

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

use Memoize;
memoize( 'fact2' );

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

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

Другие вопросы по тегам