首页 > 解决方案 > 简单的计算内存不足?

问题描述

我得到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。我进入out of memory了一台具有 4GB 内存和 4GB 缓存的计算机。对于 128GB 或 ram 服务器也是如此。

我不需要这个计算,我只是为了好玩。但我无法弄清楚为什么我会收到此out of memory消息。

编辑:我只是在样本等于或小于 3 时得到它

标签: perl

解决方案


$n = 3你的toplogies(3)意愿打电话factorial(1)factorial(0)。后一个执行不正确,并试图通过调用factorial(-1)which then call factorial(-2)which then call factorial(-3)...来创建阶乘,即无休止的递归,其中每个步骤分配更多内存。因此,这种无休止的递归将导致内存不足。类似的事情也会发生$n<3


推荐阅读