7 рдЖрд╕рд╛рди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддрди рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╢реБрд░реВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╕реНрддрд┐рд╖реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛, рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ред

рдЪрд░рдг 1


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрдирд░рд╛рд╡рд░реНрддрди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
var fact = function (n) { if (n < 2) return 1; return n * fact(n - 1); }; 


рдЪрд░рдг 2


рдмреБрдирд┐рдпрд╛рджреА рдкреБрдирд░рд╛рд╡рд░реНрддрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдмрд╛рдд рдХреНрдпрд╛ рд╣реЛрдЧреА? рд╣рдо рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЦреБрдж рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рддрд░реНрдХ рдХреЛ рдЙрд╕реА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╣рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
 (function (f) { f(f); })(function (f) { f(f); }); 

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ factorial рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рдлреИрдХреНрдЯреЛрд░рд┐рдпрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ factorials рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред
 var fact = (function (f) { return function (n) { // termination condition if (n < 2) return 1; // because f returns a function, we have a double function call. return n * f(f)(n - 1); }; })(function (f) { return function (n) { // termination condition if (n < 2) return 1; // because f returns a function, we have a double function call. return n * f(f)(n - 1); }; }); 

рдЪрд░рдг 3


рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдмрджрд╕реВрд░рдд рджреЛрд╣рд░рд╛рд╡ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдХреБрдЫ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди recur рдореЗрдВ рдЫрд┐рдкрд╛рддреЗ recur
 var recur = function (f) { return f(f); }; var fact = recur(function (f) { return function (n) { if (n < 2) return 1; // because f returns a function, we have a double function call. return n * f(f)(n - 1); }; }); 


рдЪрд░рдг 4


рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рджреЛрд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВред рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рдо рдПрдХ рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдбрдмрд▓ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЪрд╛рд▓ рдЗрд╕ рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рд╣реИ рдЬрд╣рд╛рдВ f рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ g рдХреЛ f рдХрд╣ рд╕рдХреЗрдВред
 var recur = function (f) { return f(f); }; var fact = recur(function (f) { var g = function (n) { return f(f)(n); }; return function (n) { if (n < 2) return 1; // no more double call, g is a function which takes a numeric arg return n * g(n - 1); }; }); 


рдЪрд░рдг 5


рдКрдкрд░ рдХрд╛ рдХрд╛рдо рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЗрддрдирд╛ рдЧрдиреНрджрд╛ рдХреЛрдб рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрдХ рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЗрд╡рд▓ рддрдереНрдпрд╛рддреНрдордХ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реА рд░рд╣ рдЬрд╛рдПрдЧреАред
 var recur = function (f) { return f(f); }; var wrap = function (h) { return recur(function (f) { var g = function (n) { return f(f)(n); }; return h(g); }); }; var fact = wrap(function (g) { return function (n) { if (n < 2) return 1; return n * g(n - 1); }; }); 


рдЪрд░рдг 6


рдЪрд▓реЛ g рдЕрдВрджрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ wrap рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВред
 var recur = function (f) { return f(f); }; var wrap = function (h) { return recur(function (f) { return h(function (n) { return f(f)(n); }); }); }; var fact = wrap(function (g) { return function (n) { if (n < 2) return 1; return n * g(n - 1); }; }); 


рдЪрд░рдг 7


рдЕрдм, рдпрджрд┐ рд╣рдо wrap рдЕрдВрджрд░ recur рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рднреА рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рд╕рд┐рджреНрдз рд╡рд╛рдИ-рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
 var Y = function (h) { return (function (f) { return f(f); })(function (f) { return h(function (n) { return f(f)(n); }); }); }; var fact = Y(function (g) { return function (n) { if (n < 2) return 1; return n * g(n - 1); }; }); 


рдЕрдВрдд


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред

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


All Articles