我用一个非常简单的计算out of memory
。
我正在尝试计算二叉树可能给出许多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
.我在一台具有 4GB 内存和 4GB 缓存的计算机中获得了out of memory
。与 128GB 或 RAM 服务器相同。
我不需要这个计算,我只是为了好玩而尝试。 但是我不知道为什么我会收到这条out of memory
消息。
编辑:我只是在样本等于或小于3时得到它
有了$n = 3
,你的toplogies(3)
会调用factorial(1)
和factorial(0)
。后者实现不当,并试图通过调用factorial(-1)
来创建阶乘,然后调用factorial(-2)
然后调用factorial(-3)
...,即无休止的递归,其中每个步骤分配更多的内存。因此,这种无休止的递归将导致内存不足。类似的事情发生在$n<3
.