読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Project Euler - Problem 14

Problem 14

最長のコラッツ数列を求める問題.
いい方針が浮かばなかったので, @の兄にヘルプを求めました.

use strict;
use warnings;
use Memoize;
memoize('sequence');

sub sequence {
    my $n = shift;

    if ($n == 1) {
        return 1;
    } elsif ($n % 2 == 0) {
        return sequence($n/2) + 1;
    } else {
        return sequence(3*$n+1) + 1;
    }
}

my $i = 1;
my ($max, $max_length) = (0, 0);
while ($i < 1_000_000) {
    my $length = sequence($i);
    if ($length > $max_length) {
        $max = $i;
        $max_length = $length;
    }
    $i++;
}

print "$max_length ($max)\n";

Memoizeを使えばメモ化が簡単に実現できて楽ですね.
実行時間もだいぶ現実的な感じです.

15.50s user 0.09s system 99% cpu 15.620 total