sub fibonacci {
my ($visitor) = @_;
my ($i, $j) = (0, 1);
$visitor->() for $i;
for (;;) {
$visitor->() for $j;
($i, $j) = ($j, $i+$j);
}
}
####
sub fibonacci {
my ($visitor) = @_;
my ($i, $j) = (0, 1);
$visitor->() for $i;
_fibonacci($i, $j);
}
sub _fibonacci {
my ($visitor, $i, $j) = @_;
$visitor->() for $j;
_fibonacci($j, $i+$j);
}
##
##
sub fibonacci {
my ($i, $j) = (0, 1);
return ( \$i, sub { _fibonacci($i, $j) } );
}
sub _fibonacci {
my ($i, $j) = @_;
return ( \$j, sub { _fibonacci($j, $i+$j) } );
}
##
##
{
my $iter = make_iter(\&fibonacci);
for (0..15) {
my ($n) = $iter->()
or last;
print("$n ");
}
print("\n");
}
##
##
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610