#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)}
.