私はコラッツシーケンスに取り組んでいます。現在、forループがあります。
for my $num (1..1000000) {
my $count = 1;
for (my $i = $num; $i != 1; $count++) {
$i = $i % 2 ? 3 * $i + 1 : $i / 2;
}
}
そして、ループの回数 (理論を完成させるのに何回かかるか) を計算する簡単な方法があります。
if ($count > $max_length) {
$max = $num;
$max_length = $count;
}
簡単な理論を使って、コードをより速く作成できることを突き止めました。
n = 3 の場合、このシーケンスは {3,10,5,16,8,4,2,1} になります [8] n = 6 の場合、このシーケンスは {6,3,10,5,16 になります。 ,8,4,2,1} [9] n = 12 の場合、このシーケンスは {12,6,3,10,5,16,8,4,2,1} [10] になります。
したがって、3 の結果を保存し、カウントに 1 を追加するだけで 6 の結果を計算できるようにしたいと考えています。
私はこれに対処しようとしましたが、実際にはプログラムが完了するのに1分長くかかりました.以前の30秒ではなく1.49秒かかるプログラムがあります.
これは私がキャッシュを追加した方法です(おそらく間違っています)
以下はforループの外側です
my $cache = 0;
my $lengthcache = 0;
次に、for ループの $i 行の 4 行目の後にあるこのコードのビットがあります。
$cache = $i;
$lengthcache = $count;
if ($cache = $num*2) {
$lengthcache++;
}
コードを遅くすることなく正しくキャッシュする方法を理解する必要があるだけです。