Не хватает памяти с помощью простого calc?

#perl

#perl

Вопрос:

Я получаю out of memory очень простой calc.

Я пытаюсь вычислить множество топологий, которые двоичное дерево могло бы предоставить для нескольких n образцов

Итак, я просто попробую perl -E 'sub fac{ my ($n) = @_; $n == 1 ? 1 : $n * fac($n -1)} sub top{ my ($n) = @_; $t = fac(2 * $n - 5) / (2 ** ($n - 3) * fac($n - 3) ) } say top(3)' также другую версию той же математики:

 #!/usr/bin/env perl

use warnings;
use strict;
#use features;

sub factorial{
        my ($n) = @_;
        $n == 1 ? 1 : $n * factorial($n -1)
}

sub topologies{
        my ($n) = @_;
        my $a = (2 * $n) - 5;
        my $a_f = factorial($a);
        my $b = $n -3;
        my $b_f = factorial($b);
        my $c = 2 ** $b;
        my $q = $c * $b_f;
        my $t = $a_f / $q;
        return $t;
}

print "Enter number of taxas: ";
my $input = <STDIN>;
my $ntop = topologies();

print $ntop, "n";
  

И когда я пытаюсь даже для размера выборки 3 . Я получил out of memory компьютер с 4 ГБ оперативной памяти и 4 ГБ кэша. То же самое для сервера объемом 128 ГБ или оперативной памяти.

Мне не нужен этот calc, я просто попробовал ради удовольствия. Но я не могу понять, почему я получаю это out of memory сообщение.

РЕДАКТИРОВАТЬ: я просто получаю это, когда выборка равна или меньше 3

Комментарии:

1. Подсказка: что происходит, когда $n <= 0 в factorial подсистеме?

2. На самом деле ожидается, что @mob никогда не будет иметь, $n < 1 в любом случае, если $n == 0 он вернет 0, и, конечно, следует той же логике любой математической операции. Уменьшение до меньшего, чем 0 результат должен отсутствовать 0 . В любом случае, я понимаю, что это лучше использовать $n <= 1 в sub fac обычной работе. Итак: sub fac{ my ($n) = @_; $n <= 1 ? 1 : $n * fac($n -1)}

3. Примечание: Если вы используете 32-разрядную сборку Perl, максимальный объем памяти, который может использовать процесс, составляет 2-3 гигабайта (в зависимости от операционной системы), независимо от объема оперативной памяти на компьютере.

Ответ №1:

С $n = 3 вашего toplogies(3) станется созвониться factorial(1) и factorial(0) . Последний реализован неправильно и пытается создать факториал путем вызова, factorial(-1) который затем вызывает, factorial(-2) который затем вызывает factorial(-3) …, то есть бесконечная рекурсия, где каждый шаг выделяет больше памяти. Таким образом, эта бесконечная рекурсия приведет к нехватке памяти. Похожие вещи происходят с $n<3 .

Комментарии:

1. Спасибо. Итак, это было плохо реализовано, лучше сделать sub fac{ my ($n) = @_; $n == 1 ? 1 : $n * fac($n -1)} .