рдкрд░реНрд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЧрдгрдирд╛

рд╣реИрд▓реЛ,
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдкрд░реНрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдиреБрд╕реНрдЦрд╛ рдмрддрд╛рдКрдВрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдереНрдпрд╛рддреНрдордХ рд░реВрдк рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдЗрд╕ рддрд░рд╣ рд╣реИрдВ:
 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 ) ;


Source: https://habr.com/ru/post/In169469/


All Articles