我想编写一个 perl 程序来生成长度为 8 的非重复单个数字(数字 1-8 以随机顺序排列)和第九个元素为下划线的数组。我写过这样的代码。我想将此生成的数组用于基于数字的益智游戏。
@mat = (0,0,0,0,0,0,0,0,0);
sub randgen {
$randigit = int(rand(9));
if ($randigit == 0) {
&randgen;
}
elsif ( $mat[0] == $randigit
|| $mat[1] == $randigit
|| $mat[2] == $randigit
|| $mat[3] == $randigit
|| $mat[4] == $randigit
|| $mat[5] == $randigit
|| $mat[6] == $randigit
|| $mat[7] == $randigit
|| $mat[8] == $randigit
)
{
&randgen;
}
}
&randgen;
for ( $assign = 0; $assign <= 8; $assign++) {
$mat[$assign] = $randigit;
print "@mat \n"; # To see to what extent the program has generated the array
&randgen;
}
for ($i = 0; $i <= $#mat; $i++) {
$sum = $sum + $mat[$i];
}
$miss = 36 - $sum ;
$mat[7] = $miss;
$mat[8] = "_";
print "@mat \n";
程序分配第 7 个元素后,我的程序开始消耗内存(10 GB)。我不明白这是为什么。我使用数学逻辑来找到丢失的数字(数字总和 - 36 (n(n+1)/2))。为什么要吃掉我的记忆?还是有任何有效的方法来编写相同的程序?