メモ化(memoization), 再帰関数定義関数, 最小不動点

inabaさんによる。ふむふむ。ではPerlでも書いてみましょう。

# http://www.kmonos.net/wlog/52.php#_0308050827 を参考に。
use strict;
sub fib_maker {
    my $f = shift;
    return sub {
        my $x = shift;
        return $x <= 1 ? 1 : $f->($x - 1) + $f->($x - 2);
    }
}
sub fix {
    my $G = shift;
    return $G->(
        sub {
            my $x = shift;
            return fix($G)->($x);
        }
    );
}
my $fib = &fix(\&fib_maker);
for my $x (1..5) {
    print $fib->($x), " ";
}
# -> 1 2 3 5 8

眠い。「メモ化」は誰かやって。
追記(2005-08-31):Hiroto Inabaさんが作ってくださいました。

追記(2005-09-01):Hiroto Inabaさんは、kMonos.NETのK.Inabaさんとは別の方でした。おわびして訂正します。
追記(2006-04-16):Danさんの「TuringとChurchの狭間で」で「hyukiさんも知らぬ間に一つ「反則」を犯している」とご指摘を受けました。大感謝!