perl - 简单的计算内存不足?
问题描述
我得到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 时得到它
解决方案
随$n = 3
你的toplogies(3)
意愿打电话factorial(1)
和factorial(0)
。后一个执行不正确,并试图通过调用factorial(-1)
which then call factorial(-2)
which then call factorial(-3)
...来创建阶乘,即无休止的递归,其中每个步骤分配更多内存。因此,这种无休止的递归将导致内存不足。类似的事情也会发生$n<3
。
推荐阅读
- paypal - 将 PayPal 结帐直接重定向到客人结帐
- sql - 使用 Excel VBA 将文件(如 PDF、图像、Word...)上传到 SQL Server 中的表
- javascript - 在从当前 jQuery 中删除时,在单击时将类添加到下一个整数
- cassandra - Cassandra:更新键空间的 gc_grace_seconds
- scala - 一段时间后,Apache Beam 停止处理 PubSub 消息
- spring-boot - Spring Data Rest - 使用泛型的基础存储库不起作用
- unity3d - Hololens 2中统一文本字段抖动/污迹的一部分
- c++ - 交叉编译 JNI 本机库的 TCHAR 字符问题
- java - Java 中的 Object TreeMap 与 Object HashMap
- go - Gokit:在传输层验证请求/有效负载