我正在研究一个 collatz 序列。我目前有一个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 分钟才能完成,我现在有一个需要 1.49 秒而不是我以前的 30 秒的程序。
这就是我添加缓存的方式(可能是错误的)
以下是在for循环之外
my $cache = 0;
my $lengthcache = 0;
然后我有这段代码位于 $i 行之后,for 循环中的第 4 行
$cache = $i;
$lengthcache = $count;
if ($cache = $num*2) {
$lengthcache++;
}
我不想给我完整的答案,我只需要了解如何正确缓存而不会使代码变慢。