長さ8の非反復的な1桁の数字(ランダムな順序で1〜8の数字)と9番目の要素がアンダースコアになる配列を生成するperlプログラムを作成したかったのです。このようなコードを書きました。この生成された配列を数値ベースのパズル ゲームに使用したいと考えています。
@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))。なぜ私の記憶を食べているのですか?または、同じプログラムを作成する効果的な方法はありますか?