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

初代Masteries

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

Project Euler - Problem 2

Problem 2

フィボナッチ数列を使う問題.
いい感じに先日のプロダクト(Memoizeを使ったフィボナッチ数の計算)を流用できそうですね!

use strict;
use warnings;
use Memoize;

memoize('fib');

my $sum = 0;
my $n = 0;
while (1) {
    my $fib = fib($n);
    last if $fib > 4_000_000;
    $sum += $fib if $fib % 2 == 0;

    $n++;
}

print "answer: $sum\n";

sub fib {
    my $n = shift;

    return 0 if $n == 0;
    return 1 if $n == 1 || $n == 2;
    return fib($n-1) + fib($n-2);
}

これ, C言語っぽいfor文使った方がシンプルかなー, と思って書きなおしたのがこちら.

use strict;
use warnings;
use Memoize;

memoize('fib');

my $sum = 0;
my $n = 0;
for (my $n = 0; (my $fib = fib($n)) < 4_000_000; $n++) {
    $sum += $fib if $fib % 2 == 0;
}

print "answer: $sum\n";

sub fib {
    my $n = shift;

    return 0 if $n == 0;
    return 1 if $n == 1 || $n == 2;
    return fib($n-1) + fib($n-2);
}

ちょっとキモい感じもしますが, 行数は減りました.