рд╣реИрд▓реЛ,
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдкрд░реНрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдиреБрд╕реНрдЦрд╛ рдмрддрд╛рдКрдВрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдереНрдпрд╛рддреНрдордХ рд░реВрдк рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдЗрд╕ рддрд░рд╣ рд╣реИрдВ:
f (0) = 1
f (n) = n * f (n-1)
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИрдВ, рдПрд░рд▓рдВрдЧ рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рднрд╛рдЬреНрдп (рдХреЛ реж) ->
1;
рднрд╛рдЬреНрдп (рдПрди) ->
рдПрди * рдлреИрдХреНрдЯреЛрд░рд┐рдпрд▓ (рдПрди -1)ред
рдЕрдм рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдлрд╝реЙрд░реНрдо рдХрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
#! / usr / bin / perl -I./lib
рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
bigint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рдЖрд╡рд░реНрддрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рдЖрд╡рд░реНрддрдХ рдкрд╣рд▓реВ => {
arg ( 0 ) => рд▓реИрдореНрдмреНрдбрд╛ { my ( $ n ) = @_ ; рд╡рд╛рдкрд╕реА 1 } ,
arg ( n ) => рд▓рдВрдмрд╛ { my ( $ n ) = @_ ; рд╡рд╛рдкрд╕реА $ n * fac ( $ n - 1 ) } ,
} ;
рдкреНрд░рд┐рдВрдЯ рдлреЗрд╕ ( 100 ) ;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдП рдХрд╛рд░реНрдп рд╣реИрдВ рдЖрд╡рд░реНрддрдХ, arg, n рдФрд░ lambdaред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдЖрд╡рд░реНрддрдХ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рд╛рдн рд╣реИрдВ, рдмрд╛рдХреА рд╕рднреА рдХреЛ рдХреЗрд╡рд▓ "рд╕реБрдВрджрд░" рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЪрд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ Recurrent.pm
рдкреИрдХреЗрдЬ рдЖрд╡рд░реНрддрдХ;
рд╣рдорд╛рд░реЗ $ рд╕рдВрд╕реНрдХрд░рдг = '0.01';
рдЖрдзрд╛рд░ qw (рдирд┐рд░реНрдпрд╛рддрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рдХрд╛рд░реНрдк qw (рдХрдмреВрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рд╣рдорд╛рд░реЗ @EXPORT = qw (arg n lambda рдЖрд╡рд░реНрддрдХ);
рд╕рдм рдЖрд░реНрдЧ {рд╢рд┐рдлреНрдЯ} # рдкрд╣рд▓рд╛ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ
рдЙрдк n {''} # рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ
рдЙрдк рд▓рдВрдмрд╛ (&) {рд╢рд┐рдлреНрдЯ} # рдЙрдк рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдк {}
рдЙрдк рдЖрд╡рд░реНрддрдХ ($ $) {
my ($ рдирд╛рдо, $ рдореИрдкрд┐рдВрдЧ) = @_;
рдХрдмреВрд▓ '$ рдирд╛рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП'
рдЕрдЧрд░ рд░реЗрдлрд░реА ($ рдирд╛рдо) ne '' || $ рдирд╛рдо! ~ / ^ \ p {XID_Start} \ p {XID_Continue} * $ /;
рдХрдмреВрд▓ рдХрд░рдирд╛ '$ рдореИрдкрд┐рдВрдЧ рдПрдХ рд╣реИрд╢ рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП'
рдЕрдЧрд░ рд░реЗрдлрд░реА ($ рдореИрдкрд┐рдВрдЧ) рдиреЗ 'рдПрдЪрдПрдПрд╕рдПрдЪ';
рдХрдмреВрд▓ рдирд╣реАрдВ 'рд╕рдорд╡рд░реНрддреА рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди'
рдЕрдЧрд░ рд░реЗрдлрд░реА ($ рдореИрдкрд┐рдВрдЧ -> {(n ())}) рдиреЗ 'CODE';
{
рдХреЛрдИ рд╕рдЦреНрдд 'рд░реЗрдлреНрд╕' рдирд╣реАрдВ;
# рдПрдХ рдХреИрд╢ рдФрд░ $ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдБ
рдореЗрд░реЗ $ рдореЗрдо = рдЬреНрд╡рд╛рдЗрди ('::', (рдХреЙрд▓рд░ ()) [0], "RECURRENT_CACHE_ $ рдирд╛рдо");
рдореЗрд░рд╛ $ рдордЬрд╝рд╛ = рдЬреБрдбрд╝рдирд╛ ('::', (рдХреЙрд▓рд░ ()) [0], "$ рдирд╛рдо");
{{$ рдореЗрдо} = = {};
{{$ рдордЬрд╛} = рдЙрдк {
my ($ _ n, $ _mapping) = ($ # _; $ _ [1]: $ _ [0], $ рдЯреИрдкрд┐рдВрдЧ);
рдХрдмреВрд▓ рдХрд░рдирд╛ "рддрд░реНрдХ $ рдирд╛рдо (n) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ"
рдЕрдЧрд░; рдкрд░рд┐рднрд╛рд╖рд┐рдд $ _n;
# рдХреИрд╢ рдореЗрдВ рдореВрд▓реНрдп рджреЗрдЦреЗрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЧрдгрдирд╛ рдХрд░реЗрдВ
рдкрд░рд┐рднрд╛рд╖рд┐рдд ($ {* {$ рдореЗрдо}} -> {$ _ n})
? ($ {* {$ рдореЗрдо}} -> {$ _ n})
: ($ {* {$ рдореЗрдо}} -> {$ _ n} =
рдкрд░рд┐рднрд╛рд╖рд┐рдд ($ _ рдорд╛рдирдЪрд┐рддреНрд░рдг -> {$ _ n})
? do {рд╕реНрдерд╛рдиреАрдп $ _ = $ _n; $ _mapping -> {$ _ n} -> ($ _ n)}
: do {рд╕реНрдерд╛рдиреАрдп $ _ = $ _n; $ _mapping -> {(n)} -> ($ _ n)});
};
}
}
1;
рдЕрдм, рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред
#! / usr / bin / perl -I./lib
рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
bigint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рдЖрд╡рд░реНрддрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
# # f (0) = 0
# # f (1) = 1
# # f (n) = f (n-1) + f (n-2)
рдЖрд╡рд░реНрддрдХ рддрдВрддреБ => {
arg ( 0 ) => рд▓реИрдореНрдмреНрдбрд╛ { my ( $ n ) = @_ ; рд╡рд╛рдкрд╕реА 0 } ,
arg ( 1 ) => рд▓реИрдореНрдмреНрдбрд╛ { my ( $ n ) = @_ ; рд╡рд╛рдкрд╕реА 1 } ,
arg ( n ) => рд▓рдВрдмрд╛ { my ( $ n ) = @_ ; рд░рд┐рдЯрд░реНрди рдлрд╝рд╛рдЗрдм ( $ n - 1 ) + рдлрд╝рд╛рдЗрдм ( $ n - 2 ) } ,
} ;
рдкреНрд░рд┐рдВрдЯ рдлрд╝рд╛рдЗрдм ( 100 ) ;
рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдмрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдХрдирд╡рд▓реНрд╢рди рдХреЛ рдХрдо рдпрд╛ рдореЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ
рдЙрдк рдШрдЯрд╛ ( & @ ) {
my ( $ f , $ z , @x ) = @_ ;
рдирдХреНрд╢рд╛ {
рд╕реНрдерд╛рдиреАрдп ( $ a , $ b ) = ( $ _ , $ z ) ;
$ z = $ f -> ( $ a , $ b ) ;
} @x ;
$ z ;
}
рдФрд░ 1 рд╕реЗ 100 рддрдХ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
рдкреНрд░рд┐рдВрдЯ рдХрдо {$ a + $ b} рдирдХреНрд╢рд╛ {fib ($ _)} 1..100;
рдЕрдкрдбреЗрдЯ:
рдЖрд╢реБрд▓рд┐рдкрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдорд░реНрдерди
#! / usr / bin / perl -I./lib
utf8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
bigint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рдЖрд╡рд░реНрддрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ;
рдЙрдк ╬╗ ( & ) { рд╢рд┐рдлреНрдЯ }
# # = (0) = 0
# # = (1) = 1
# # = (n) = ╞Т (n-1) + n (n-2)
рдЖрд╡рд░реНрддрдХ ╞Т => {
( 0 ) => ╬╗ { 0 } ,
( 1 ) => ╬╗ { 1 } ,
( n ) => ╬╗ { ╞Т ( $ _ - 1 ) + $ ( $ _ - 2 ) } ,
} ;
рдкреНрд░рд┐рдВрдЯ print ( 100 ) ;