Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
package MyMath;
our $VERSION = '0.01';
use strict;
use bigint;
use Recurrent;
sub new {
bless {}, shift;
}
recurrent 'fib' => {
arg(0) => lambda { my($n) = @_; return 0 },
arg(1) => lambda { my($n) = @_; return 1 },
arg(n) => lambda { my($n) = @_; return fib($n-1) + fib($n-2) },
};
1;
#!/usr/bin/perl -I./lib use strict; use bigint; use Test::More tests => 2; use MyMath; is(MyMath->new->fib(100), MyMath::fib(100), "two modes"); is(MyMath->new->fib(100), 354224848179261915075, "fib(100)");
arg(0) => sub { 0 },
arg(1) => sub { 1 },
arg(n) => sub { fib($_-1) + fib($_-2) },
$mycallback->() for ($myarg);
use Sub::Name;
*foo = subname foo => sub{};
use v5.14;
use Memoize;
use List::Util qw(sum reduce);
memoize 'fib';
say sum map fib($_), 1..100; # "sum" is a "reduce { $a + $b }"
sub fib {
my $n = shift;
return $n if $n < 2;
fib($n-1) + fib($n-2);
}
Вычисление рекуррентных соотношений на Perl