рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдзреБрдирд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИрдВ: рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрдирдХреА рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрд╕реЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдХрд╛рд░реНрдп рдпрд╣ рд╕рдордЭрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рд╣реИ, рд╡рд╣ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддреЗрдЬреА рд╕реЗред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдореВрд▓ рдЕрдиреБрдорд╛рди рддрдХрдиреАрдХреЛрдВ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ: рдПрдХ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХреЗ; рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рдХрдЯреМрддреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдФрд░ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╣реАрдВ рднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдмрдбрд╝реЗ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ ( рд╕реНрдХрд╛рд▓рд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ ) рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ; рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рдж рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ ( рдкреНрд░реЛрдЧрд╛рд░реНрдб ); рдпрд╛ рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди ( JVM JIT рд╕рдВрдХрд▓рдХ ) рдХреЗ рджреМрд░рд╛рди рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕реАрдорд╛рдПрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдо рд╣реИ: рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЗрдирд╛ рдФрд░ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдореЗрдВ рдмрджрд▓рдирд╛, рдЬреЛ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреЗрдЬреА рд╕реЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдбреНрд░рд╛рдлреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯрд╛ рдФрд░ рддреЗрдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдбреНрд░рд╛рдлреНрдЯ рдХрд╛рд░реНрдпрдХреНрд░рдо


рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЬрд╛рд╡рд╛ рдореЗрдВ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рднрд╛рд╖рд╛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдХреЛрдбрд╛рдВрддрд░рдХ - рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИ ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрдЪреНрдЫреА рдиреАрдВрд╡ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рдмрджреМрд▓рдд рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рди рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рддрдХрдиреАрдХ рд▓рдЧрднрдЧ рд╕рднреА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдорд╕реМрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдорд╛рдирдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдЦреБрдж рд╣реА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдХреНрдпрд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЪрд┐рддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

static int main(int n){ int count = 0, total = 0, multiplied = 0; Logger logger = new PrintLogger(); while(count < n){ count += 1; multiplied *= count; if (multiplied < 100) logger.log(count); total += ackermann(2, 2); total += ackermann(multiplied, n); int d1 = ackermann(n, 1); total += d1 * multiplied; int d2 = ackermann(n, count); if (count % 2 == 0) total += d2; } return total; } // https://en.wikipedia.org/wiki/Ackermann_function static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } interface Logger{ public Logger log(Object a); } static class PrintLogger implements Logger{ public PrintLogger log(Object a){ System.out.println(a); return this; } } static class ErrLogger implements Logger{ public ErrLogger log(Object a){ System.err.println(a); return this; } } 

рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ, рдХреЛрдб рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рднрд╛рдЧ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдпрд╣ main рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЕрдм рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд░реЗрдВ


рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ logger рдЪрд░ рдХрд╛ рдПрдХ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рд╣реИ: Logger рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╡рд░реНрдЧ рд╣реИ - PrintLogger :

 - Logger logger = new PrintLogger(); + PrintLogger logger = new PrintLogger(); 

рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ logger PrintLogger , рдФрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ logger.log рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрдирд▓рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 - if (multiplied < 100) logger.logcount(); + if (multiplied < 100) System.out.println(count); 

рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ ErrLogger рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди public Logger log рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдХрд░, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЙрд▓ рдХреЗ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЗрдирд▓рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

рдЬрдорд╛рд╡рдЯ рдХрд╛рдВрд╕реНрдЯреЗрдВрдЯ


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, count рдФрд░ total рдкрд░рд┐рд╡рд░реНрддрди, рд▓реЗрдХрд┐рди multiplied рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ 0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ multiplied = multiplied * count рдорд╛рдзреНрдпрдо рд╕реЗ multiplied = multiplied * count , 0 рдмрд░рд╛рдмрд░ рд░рд╣рддрд╛ рд╣реИред рддреЛ, рдЖрдк рдЗрд╕реЗ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ 0 рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 static int main(int n){ - int count = 0, total = 0, multiplied = 0; + int count = 0, total = 0; PrintLogger logger = new PrintLogger(); while(count < n){ count += 1; - multiplied *= count; - if (multiplied < 100) System.out.println(count); + if (0 < 100) logger.log(count); total += ackermann(2, 2); - total += ackermann(multiplied, n); + total += ackermann(0, n); int d1 = ackermann(n, 1); - total += d1 * multiplied; int d2 = ackermann(n, count); if (count % 2 == 0) total += d2; } return total; } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ d1 * multiplied рд╣рдореЗрд╢рд╛ 0 , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ total += d1 * multiplied рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 - total += d1 * multiplied 

рдореГрдд рдХреЛрдб рд╣рдЯрд╛рдирд╛


multiplied рдФрд░ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ total += d1 * multiplied рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдк int d1 рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 - int d1 = ackermann(n, 1); 

рдпрд╣ рдЕрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ ackermann рдПрдХ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд╛рдкрдирд╛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕реА рддрд░рд╣, logger.log рдмрд╛рдж, logger рдЦреБрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 - PrintLogger logger = new PrintLogger(); 

рд╢рд╛рдЦрд╛ рдирд┐рдХрд╛рд▓рдирд╛


рдЕрдм рд╣рдорд╛рд░реЗ рдЪрдХреНрд░ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг 0 < 100 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдмрд╕ рд╢рд░реНрдд рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 - if (0 < 100) System.out.println(count); + System.out.println(count); 

рдХреЛрдИ рднреА рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рдд рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдРрд╕реЗ рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреЗ рд╢рд░реАрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдВрд╢рд┐рдХ рдЧрдгрдирд╛


рдЕрдм рд╣рдо рддреАрди рд╢реЗрд╖ рдХреЙрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:

  total += ackermann(2, 2); total += ackermann(0, n); int d2 = ackermann(n, count); 

  • рдкрд╣рд▓реЗ рдХреЗ рджреЛ рдирд┐рд░рдВрддрд░ рддрд░реНрдХ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рд╢реБрджреНрдз рд╣реИ, рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛ рдкрд░ ackermann(2, 2) 7. рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 7.
  • рджреВрд╕рд░реА рдХреЙрд▓ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рддрд░реНрдХ 0 рдФрд░ рдПрдХ рдЕрдЬреНрдЮрд╛рдд n ред рдЖрдк рдЗрд╕реЗ ackermann рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм m 0 , рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ n + 1.
  • рддреАрд╕рд░реА рдХреЙрд▓ рдореЗрдВ, рджреЛрдиреЛрдВ рддрд░реНрдХ рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВ: n рдФрд░ count ред рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ ackermann рд▓рд┐рдП рдХреЙрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } 

рдЖрдк рдЗрд╕реЗ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 - total += ackermann(2, 2); + total += 7 - total += ackermann(0, n); + total += n + 1 int d2 = ackermann(n, count); 

рджреЗрд░ рд╕реЗ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдирд╛


рдбреА 2 рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рд╢рд░реНрдд if (count % 2 == 0) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ if (count % 2 == 0) ред рдЪреВрдБрдХрд┐ ackermann рдЧрдгрдирд╛ рд╕рд╛рдл рд╣реИ, рдЖрдк рдЗрд╕ рдХреЙрд▓ рдХреЛ рдПрдХ рд╕рд╢рд░реНрдд ackermann рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рддрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рди рд╣реЛ:

 - int d2 = ackermann(n, count); - if (count % 2 == 0) total += d2; + if (count % 2 == 0) { + int d2 = ackermann(n, count); + total += d2; + } 

рдпрд╣ ackermann(n, count) рдЖрдзреЗ рдХреЙрд▓ рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рддреЗрдЬреА ackermann(n, count) ред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, System.out.println рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдл тАЛтАЛрдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рд╢рд░реНрдд рдЫрд▓рд╛рдВрдЧ рдХреЗ рдЕрдВрджрд░ рдпрд╛ рдмрд╛рд╣рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрдХреВрд▓рд┐рдд рдкрд░рд┐рдгрд╛рдо


рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:

 static int main(int n){ int count = 0, total = 0; while(count < n){ count += 1; System.out.println(count); total += 7; total += n + 1; if (count % 2 == 0) { total += d2; int d2 = ackermann(n, count); } } return total; } static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } 

рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдордиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рдЖрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрд╡реАрдПрдо рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд▓рд┐рдЦрд╛ рдерд╛, рдЙрд╕рдХрд╛ рд╡рд┐рдШрдЯрд┐рдд рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

 static int main(int var0) { new Demo.PrintLogger(); int var1 = 0; int var3; for(int var2 = 0; var2 < var0; var2 = var3) { System.out.println(var3 = 1 + var2); int var10000 = var3 % 2; int var7 = var1 + 7 + var0 + 1; var1 = var10000 == 0 ? var7 + ackermann(var0, var3) : var7; } return var1; } static int ackermann__I__TI1__I(int var0) { if (var0 == 0) return 2; else return ackermann(var0 - 1, var0 == 0 ? 1 : ackermann__I__TI1__I(var0 - 1);); } static int ackermann(int var0, int var1) { if (var0 == 0) return var1 + 1; else return var1 == 0 ? ackermann__I__TI1__I(var0 - 1) : ackermann(var0 - 1, ackermann(var0, var1 - 1)); } static class PrintLogger implements Demo.Logger {} interface Logger {} 

рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдб рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рдХреБрдЫ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, new PrintLogger рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЙрд▓), рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ackermann рдФрд░ ackermann__I__TI1__I )ред рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдСрдЯреЛрдореИрдЯрд┐рдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдиреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреИрд╕рд╛ рдХрд┐рдпрд╛ рдерд╛, рд╡реИрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ред

рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреИрд╕реЗ?

рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдЪрд╛рд░


рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рдЬреЛ рд╢рд╛рдпрдж рдЙрдарддрд╛ рд╣реИ, рд╡рд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛: "рдкреНрд░реЛрдЧреНрд░рд╛рдо" рдХреНрдпрд╛ рд╣реИ?

рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдкрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛, рд╢рд╛рдпрдж рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рднреА рдбреАрдмрдЧ рдХрд┐рдпрд╛ред рдЖрдк рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ , рддреАрди-рдкрддрд╛ рдХреЛрдб , рдП-рд╕рд╛рдорд╛рдиреНрдп , рдирд┐рд░рдВрддрд░ рдкрд╛рд╕рд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓, рдпрд╛ рдПрдХрд▓ рд╕реНрдЯреЗрдЯрд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрднреНрдпрд╛рд╡реЗрджрди рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо рдЕрдиреБрдХреВрд▓рдХ рдХреЗ рдЕрдВрджрд░ рдПрдХ "рдХрд╛рд░реНрдпрдХреНрд░рдо" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

рд╕реНрд░реЛрдд рдХреЛрдб


 static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } 

рдЕрд╕рдореНрдмрджреНрдз рд╕реНрд░реЛрдд рдХреЛрдб рднреА рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ, рдорд╛рдирд╡-рдкрдардиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рджреЛ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдирд╛рдо рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд╣реИрдВред
  • рд╕рд╣реА рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдФрд░ рдЧрд▓рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрдВ, рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рдЗрдирдкреБрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд╕рд╣реА рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛред

рдпреЗ рдХрд╛рд░рдХ рдЕрдиреБрдХреВрд▓рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдЯрд░реНрди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛, рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдПрдХ рдмрд╣реБрддрд╛рдпрдд рдХреЗ рд╕рд╛рде рдкреИрдЯрд░реНрди рдХреЛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рджреВрд╕рд░рд╛ рдХрд╛рд░рдХ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдФрд░ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдореА рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╣реБрдд рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдпреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдорд╛рдирд╡ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХреЛрдб рдмреЗрд╕ рдХреЛ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдФрд░ рдХреЛрдб рдмреЗрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХрд┐рд╕реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдХреЗ рдкреЗрдбрд╝


 static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } IfElse( cond = BinOp(Ident("m"), "=", Literal(0)), then = Return(BinOp(Ident("n"), "+", Literal(1)), else = IfElse( cond = BinOp(Ident("n"), "=", Literal(0)), then = Return(Call("ackermann", BinOp(Ident("m"), "-", Literal(1)), Literal(1)), else = Return( Call( "ackermann", BinOp(Ident("m"), "-", Literal(1)), Call("ackermann", Ident("m"), BinOp(Ident("n"), "-", Literal(1))) ) ) ) ) 



рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рд╛рд░реВрдк рд╣реИред рд╡реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдореВрд░реНрдд рд╕реАрдврд╝реА рдХреЗ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдПрдПрд╕рдЯреА рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ, рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рд╕реНрдерд╛рдиреАрдп рдЪрд░реЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд░ рдирд┐рд░реВрдкрдг рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

 static int ackermannA(int m, int n){ int p = n; int q = m; if (q == 0) return p + 1; else if (p == 0) return ackermannA(q - 1, 1); else return ackermannA(q - 1, ackermannA(q, p - 1)); } Block( Assign("p", Ident("n")), Assign("q", Ident("m")), IfElse( cond = BinOp(Ident("q"), "==", Literal(0)), then = Return(BinOp(Ident("p"), "+", Literal(1)), else = IfElse( cond = BinOp(Ident("p"), "==", Literal(0)), then = Return(Call("ackermann", BinOp(Ident("q"), "-", Literal(1)), Literal(1)), else = Return( Call( "ackermann", BinOp(Ident("q"), "-", Literal(1)), Call("ackermann", Ident("q"), BinOp(Ident("p"), "-", Literal(1))) ) ) ) ) ) static int ackermannB(int m, int n){ int r = n; int s = m; if (s == 0) return r + 1; else if (r == 0) return ackermannB(s - 1, 1); else return ackermannB(s - 1, ackermannB(s, r - 1)); } Block( Assign("r", Ident("n")), Assign("s", Ident("m")), IfElse( cond = BinOp(Ident("s"), "==", Literal(0)), then = Return(BinOp(Ident("r"), "+", Literal(1)), else = IfElse( cond = BinOp(Ident("r"), "==", Literal(0)), then = Return(Call("ackermann", BinOp(Ident("s"), "-", Literal(1)), Literal(1)), else = Return( Call( "ackermann", BinOp(Ident("s"), "-", Literal(1)), Call("ackermann", Ident("s"), BinOp(Ident("r"), "-", Literal(1))) ) ) ) ) ) 

рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрджреНрдпрдкрд┐ рдПрдПрд╕рдЯреАрдПрд╕ рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рдиреЛрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреЗрдбрд╝реЛрдВ рдХреА рддрд░рд╣ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ: Ident("r") рдФрд░ Ident("s") рдХреЗ рдорд╛рди рдЙрдирдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЕрдкрд╕реНрдЯреНрд░реАрдо Assign("r", ...) рдиреЛрдб Ident("s") рдирд┐рд░реНрдзрд╛рд░рд┐рдд Ident("s") рд╣реИрдВред Assign("r", ...) рдФрд░ Assign("s", ...) ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, Ident рдФрд░ Assign рдмреАрдЪ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд░реНрде рд╕рдВрдмрдВрдз рд╣реИрдВ рдЬреЛ рдПрдПрд╕рдЯреА рдЯреНрд░реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:



рдпреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрдХреНрд░ рд╕рд╣рд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЧреНрд░рд╛рдл рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдмрд╛рдИрдЯрдХреЛрдб


рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЬрд╛рд╡рд╛ рдХреЛ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ .class рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ Java bytecode рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ ackermann рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ:

 static int ackermann(int m, int n){ if (m == 0) return n + 1; else if (n == 0) return ackermann(m - 1, 1); else return ackermann(m - 1, ackermann(m, n - 1)); } 

рдпрд╣ рдЗрд╕ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  0: iload_0 1: ifne 8 4: iload_1 5: iconst_1 6: iadd 7: ireturn 8: iload_1 9: ifne 20 12: iload_0 13: iconst_1 14: isub 15: iconst_1 16: invokestatic ackermann:(II)I 19: ireturn 20: iload_0 21: iconst_1 22: isub 23: iload_0 24: iload_1 25: iconst_1 26: isub 27: invokestatic ackermann:(II)I 30: invokestatic ackermann:(II)I 33: ireturn 

рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (JVM), рдЬреЛ рдЬрд╛рд╡рд╛ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдПрдХ рд╕реНрдЯреИрдХ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдПрдХ рдорд╢реАрди рд╣реИ: рдЗрд╕рдореЗрдВ рдСрдкрд░реЗрдВрдбреНрд╕ (STACK) рдХрд╛ рдПрдХ рд╕реНрдЯреИрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝-рддреЛрдбрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ (LOCALS) рдХреА рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕рдореЗрдВ рдпреЗ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд╛рдиреАрдп рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдкрд╣рд▓реЗ рдПрди рд╕реНрд▓реЙрдЯреНрд╕ рдореЗрдВ рдПрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреИрдХ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрди рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдЪрд░ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдХреЙрд▓ рдХреЛ рдСрдкреЗрд░реИрдВрдб рд╕реНрдЯреИрдХ рд╕реЗ рдореВрд▓реНрдп return рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдмреБрд▓рд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдХ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмреАрдЪ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдмрд╛рдИрдЯреЗрдХреЛрдб рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

  BYTECODE LOCALS STACK |a0|a1| | 0: iload_0 |a0|a1| |a0| 1: ifne 8 |a0|a1| | 4: iload_1 |a0|a1| |a1| 5: iconst_1 |a0|a1| |a1| 1| 6: iadd |a0|a1| |v1| 7: ireturn |a0|a1| | 8: iload_1 |a0|a1| |a1| 9: ifne 20 |a0|a1| | 12: iload_0 |a0|a1| |a0| 13: iconst_1 |a0|a1| |a0| 1| 14: isub |a0|a1| |v2| 15: iconst_1 |a0|a1| |v2| 1| 16: invokestatic ackermann:(II)I |a0|a1| |v3| 19: ireturn |a0|a1| | 20: iload_0 |a0|a1| |a0| 21: iconst_1 |a0|a1| |a0| 1| 22: isub |a0|a1| |v4| 23: iload_0 |a0|a1| |v4|a0| 24: iload_1 |a0|a1| |v4|a0|a1| 25: iconst_1 |a0|a1| |v4|a0|a1| 1| 26: isub |a0|a1| |v4|a0|v5| 27: invokestatic ackermann:(II)I |a0|a1| |v4|v6| 30: invokestatic ackermann:(II)I |a0|a1| |v7| 33: ireturn |a0|a1| | 

рдпрд╣рд╛рдВ, a0 рдФрд░ a1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП a1 рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд░рдВрдн рдореЗрдВ LOCALS рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред 1 iconst_1 рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ v1 рд╕реЗ v7 , рдордзреНрдпрд╡рд░реНрддреА рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред v1 , v3 рдФрд░ v7 рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди ireturn рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдиреНрдп рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП LOCALS рд╕рд░рдгреА рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред

рдКрдкрд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рджреЗрдЦреЗ - ackermannA рдФрд░ ackermannB ред рдЗрд╕рд▓рд┐рдП рд╡реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ:

  BYTECODE LOCALS STACK |a0|a1| | 0: iload_1 |a0|a1| |a1| 1: istore_2 |a0|a1|a1| | 2: iload_0 |a0|a1|a1| |a0| 3: istore_3 |a0|a1|a1|a0| | 4: iload_3 |a0|a1|a1|a0| |a0| 5: ifne 12 |a0|a1|a1|a0| | 8: iload_2 |a0|a1|a1|a0| |a1| 9: iconst_1 |a0|a1|a1|a0| |a1| 1| 10: iadd |a0|a1|a1|a0| |v1| 11: ireturn |a0|a1|a1|a0| | 12: iload_2 |a0|a1|a1|a0| |a1| 13: ifne 24 |a0|a1|a1|a0| | 16: iload_3 |a0|a1|a1|a0| |a0| 17: iconst_1 |a0|a1|a1|a0| |a0| 1| 18: isub |a0|a1|a1|a0| |v2| 19: iconst_1 |a0|a1|a1|a0| |v2| 1| 20: invokestatic ackermannA:(II)I |a0|a1|a1|a0| |v3| 23: ireturn |a0|a1|a1|a0| | 24: iload_3 |a0|a1|a1|a0| |a0| 25: iconst_1 |a0|a1|a1|a0| |a0| 1| 26: isub |a0|a1|a1|a0| |v4| 27: iload_3 |a0|a1|a1|a0| |v4|a0| 28: iload_2 |a0|a1|a1|a0| |v4|a0|a1| 29: iconst_1 |a0|a1|a1|a0| |v4|a0|a1| 1| 30: isub |a0|a1|a1|a0| |v4|a0|v5| 31: invokestatic ackermannA:(II)I |a0|a1|a1|a0| |v4|v6| 34: invokestatic ackermannA:(II)I |a0|a1|a1|a0| |v7| 37: ireturn |a0|a1|a1|a0| | 

рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рджреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ LOCAL рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ 0 рдФрд░ 1 рд╕реЗ рддрд░реНрдХ рдорд╛рдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ 2 рдФрд░ 3 рдХреЗ рддрд╣рдд рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, bytecode рдЖрдкрдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдирд╛рдореЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ: рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ LOCALS рд╕рд░рдгреА рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рдеред рдЗрд╕рд▓рд┐рдП, ackermannA рдФрд░ ackermannB рд╕рдорд╛рди ackermannB рд╣реЛрдВрдЧреЗред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВ!

рд╣рд╛рд▓рд╛рдБрдХрд┐, ackermannA рдФрд░ ackermannB рдХреЛ рдореВрд▓ ackermann рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА ackermannB рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╣рд╛рд▓рд╛рдБрдХрд┐, bytecode рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░реЛрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдЗрди рдЪрд░реЛрдВ рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ / рд╕реЗрд╡рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдорд╛рди LOCALS рдФрд░ STACK рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЛрдбрд┐рдВрдЧ / рд╕реЗрд╡рд┐рдВрдЧ рд╕реЗ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдХрдореА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рдПрдХ рдФрд░ рдЦрд╛рдореА рд╣реИ: рдЕрдзрд┐рдХрд╛рдВрд╢ рд░реИрдЦрд┐рдХ рдЕрд╕реЗрдВрдмрд▓рд░реЛрдВ рдХреА рддрд░рд╣, рдпрд╣ рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдореВрд▓ ackermann рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

  BYTECODE LOCALS STACK |a0|a1| | 0: iload_0 |a0|a1| |a0| 1: ifne 8 |a0|a1| | 4: iload_1 |a0|a1| |a1| 5: iconst_1 |a0|a1| |a1| 1| 6: iadd |a0|a1| |v1| 7: ireturn |a0|a1| | 8: iload_1 |a0|a1| |a1| 9: ifne 20 |a0|a1| | 12: iload_0 |a0|a1| |a0| 13: iconst_1 |a0|a1| |a0| 1| 14: isub |a0|a1| |v2| 15: iconst_1 |a0|a1| |v2| 1| 16: invokestatic ackermann:(II)I |a0|a1| |v3| 19: ireturn |a0|a1| | 20: iload_0 |a0|a1| |a0| 21: iconst_1 |a0|a1| |a0| 1| 22: isub |a0|a1| |v4| 23: iload_0 |a0|a1| |v4|a0| 24: iload_1 |a0|a1| |v4|a0|a1| 25: iconst_1 |a0|a1| |v4|a0|a1| 1| 26: isub |a0|a1| |v4|a0|v5| 27: invokestatic ackermann:(II)I |a0|a1| |v4|v6| 30: invokestatic ackermann:(II)I |a0|a1| |v7| 33: ireturn |a0|a1| | 

рдЪрд▓реЛ рдПрдХ рдореЛрдЯрд╛ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ: рдлрд╝рдВрдХреНрд╢рди рдХреЛ 30: invokestatic ackermann:(II)I рдХреЙрд▓ рдХрд░реЗрдВ 30: invokestatic ackermann:(II)I рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ 30: invokestatic ackermann:(II)I ред рдФрд░ рдлрд┐рд░ рдЗрд╕ рдХреЙрд▓ рдХреЛ рд╕рдордХрдХреНрд╖ рдХреЙрд▓ 30: invokestatic ackermann2:(I)I рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреВрд▓рди рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ 30: invokestatic ackermann:(II)I рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП "рдореГрдд рдХреЛрдб рд╣рдЯрд╛рдиреЗ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ 30: invokestatic ackermann:(II)I

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢ 30 рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмрд▓реНрдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рднреА рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреА рдЧрдгрдирд╛ рдХрд╣рд╛рдВ рдХреА рдЧрдИ рд╣реИ ( v4 рдореЗрдВ v4 ), рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рднреА рджреЗрдВред рд╣рдо 30 рд╕реЗ 22 , рдФрд░ 22 рд╕реЗ 21 рдФрд░ 20 рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг:

  BYTECODE LOCALS STACK |a0|a1| | 0: iload_0 |a0|a1| |a0| 1: ifne 8 |a0|a1| | 4: iload_1 |a0|a1| |a1| 5: iconst_1 |a0|a1| |a1| 1| 6: iadd |a0|a1| |v1| 7: ireturn |a0|a1| | 8: iload_1 |a0|a1| |a1| 9: ifne 20 |a0|a1| | 12: iload_0 |a0|a1| |a0| 13: iconst_1 |a0|a1| |a0| 1| 14: isub |a0|a1| |v2| 15: iconst_1 |a0|a1| |v2| 1| 16: invokestatic ackermann:(II)I |a0|a1| |v3| 19: ireturn |a0|a1| | - 20: iload_0 |a0|a1| | - 21: iconst_1 |a0|a1| | - 22: isub |a0|a1| | 23: iload_0 |a0|a1| |a0| 24: iload_1 |a0|a1| |a0|a1| 25: iconst_1 |a0|a1| |a0|a1| 1| 26: isub |a0|a1| |a0|v5| 27: invokestatic ackermann:(II)I |a0|a1| |v6| - 30: invokestatic ackermann:(II)I |a0|a1| |v7| + 30: invokestatic ackermann2:(I)I |a0|a1| |v7| 33: ireturn |a0|a1| | 

рд╣рдо рдЕрднреА рднреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг ackermann рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдХрдИ, рдкрд░рд╕реНрдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рднреА рдЫреЛрдЯреЗ рдЕрд░реНрде рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкреВрд░реЗ рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рдХрдИ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ LOCALS рдФрд░ STACK рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИ: рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ v4 рдирд┐рд░реНрджреЗрд╢ 22 рд╕реЗ рдирд┐рд░реНрджреЗрд╢ 30 рддрдХ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 22 a0 рдФрд░ 1 рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрджреЗрд╢ 21 рдФрд░ 20 рд╕реЗ рдЖрддреЗ рд╣реИрдВред рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЧреНрд░рд╛рдл рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ LOCALS рдФрд░ STACK рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реНрдерд╛рди рдкрд░ред

рд╣рдорд╛рд░реЗ рдПрдПрд╕рдЯреАрдПрд╕ рдореЗрдВ Ident / Assign рдЬреЛрдбрд╝реЗ рдХреА рддрд░рд╣, LOCALS рдФрд░ STACK рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рддреЗ рд╣реИрдВред рддреЛ рд╣рдо рд╕реАрдзреЗ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╢реБрд░реВ рдХрд░рддреЗ?

рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд░реЗрдЦрд╛рдВрдХрди


рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд░реЗрдЦрд╛рдВрдХрди рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рдмрд╛рдж рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рд╣реИред рдпрджрд┐ рд╣рдо Ident / Assign рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб LOCALS рдФрд░ STACK рдХреЗ рдмреАрдЪ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред ackermann рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП ackermann рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдПрдПрд╕рдЯреА рдпрд╛ рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ-рдмрд╛рдпрдЯреЗрдХреЛрдб рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рд╡рд┐рдкрд░реАрдд, рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдлрд╝ рдПрдХ "рд╕реНрдерд╛рдиреАрдп рдЪрд░" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ: рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмреАрдЪ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдмрд╛рдпрдЯреЗрдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдорд╛рди рдХреИрд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ; рдПрдПрд╕рдЯреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдФрд░ Assign / Ident рд╕рдВрдШреЛрдВ рдХреЗ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ; рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд░реЗрдЦрд╛рдВрдХрди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдХреНрд╕рд░ рдмрджрд▓рд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╣реИ - рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдкрддрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ "рдЪрд▓рддреА рдореВрд▓реНрдпреЛрдВ" рдХрд╛ рд╢реБрджреНрдз рд╡рд┐рдЪрд╛рд░ред

рд░реЗрдЦреАрдп рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ ackermann рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ: ackermann рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдиреЛрдб рдХреЛ ackermann рдХреЙрд▓ рдХреЗ рд╕рд╛рде ackermann рдФрд░ рдПрдХ рддрд░реНрдХ рдХреЛ ackermann рдмрд╕ рдЧреНрд░рд╛рдлрд╝ рдиреЛрдб (рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд) рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЯреНрд░рд╛рдВрдЬрд┐рдЯ рдиреЛрдбреНрд╕ (рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд) рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, ackermann(int n, int m) рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо ( ackermann(int n, int m) рдЬрдЧрд╣) рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдЧреНрд░рд╛рдл рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд░реЗрдЦреАрдп рдмрд╛рдЗрдЯрдХреЛрдб рдпрд╛ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ: рд╡реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВред

рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИрдВ: рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рд╛рдЬреНрдп рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреЛ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рдФрд░ рдЙрд╕рд╕реЗ рдкрд░реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИрдВред рдореИрдВрдиреЗ рдЧреНрд░рд╛рдлрд╝ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдирд┐рдХрд╛рд▓рдирд╛, рдЖрдЧреЗ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд╕рдВрдХреНрд░рдордг, рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕рдВрдХреНрд░рдордг (рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдЧрд╣рд░рд╛рдИ рдореЗрдВ), рдЖрджрд┐ред рдпрджрд┐ рдЖрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдм рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред ред

рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рд░реИрдЦрд┐рдХ рдмрд╛рдпреЛрдЯреЗрдХ рд╕реЗ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдЧреНрд░рд╛рдл рд╕реЗ рд╡рд╛рдкрд╕ рдмрд╛рдпрдЯреЗрдХреЛрдб рддрдХред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреБрдЫ рддрдереНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЙрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдХрдИ рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ:

  • рд▓рдЧрд╛рддрд╛рд░ рддрд╣: рдХреНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЬреНрдЮрд╛рдд рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рд╢реБрджреНрдз рд╣реИ?
  • рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ: рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдПрдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
  • : ?
  • : ┬л┬╗? - ? ?
  • : , ?

, , , . , , , .

, , , тАФ , . .

(Inference Lattice)


, . , ┬л┬╗ - :

  • Integer ? String ? Array[Float] ? PrintLogger ?
  • CharSequence ? String , - StringBuilder ?
  • Any , , ?

:



: , "hello" String , String CharSequence . "hello" , (Singleton Type) тАФ . :



, , . , . , , , String StringBuilder , , : CharSequence . , 0 , 1 , 2 , , Integer .



, , :



, , . , .

count


main :

 static int main(int n){ int count = 0, multiplied = 0; while(count < n){ if (multiplied < 100) logger.log(count); count += 1; multiplied *= count; } return ...; } 

ackermann , count , multiplied logger . :



, count 0 block0 . block1 , , count < n : , block3 return , block2 , count 1 count , block1 . , < false , block3 .

?

  • block0 . , count = 0.
  • block1 , , n ( , Integer ), , if . block2 block3.
  • block3 , , block1b , block2 , , block1c . , block2 count , 1 count.
  • , count 0 1 : count Integer.
  • : block1 n count Integer .
  • block2 , count Integer + 1 -> Integer . , count Integer , .

multiplied


, multiplied :

  • block0 . , multiplied 0.
  • block1 , , . block2 block3 ( ).
  • block2 , block2 ( 0 ) count ( Integer ). 0 * Integer -> 0 , multiplied 0.
  • block1 block2 . multiplied 0 , .

multiplied 0 , , :

  • multiplied < 100 true.
  • if (multiplied < 100) logger.log(count); logger.log(count) .
  • , multiplied , , 0 .

:



:



:

 static int main(int n){ int count = 0; while(count < n){ logger.log(count); count += 1; } return ...; } 

, , , , .

multiplied -> 0 , , . , , . , .

, . :

  • .
  • .
  • .
  • : .

count , multiplied . , multiplied count , count multiplied . , .

, тАФ : , . , ( ) . .

while , , O( ) . (, ) , , .

, .


, . , , , , .


. :

 static int main(int n){ return called(n, 0); } static int called(int x, int y){ return x * y; } 

:



main :

  • main(n)
    • called(n, 0)
      • x * y x = n y = 0
      • n * 0 0
    • called(n, 0) 0
  • main(n) 0

, , . .

, called(n, 0) 0 , :



:

 static int main(int n){ return 0; } 

: A B, C, D, D C, B, D A. A B B A, A A, , !


, Java:

 public static Any factorial(int n) { if (n == 1) { return 1; } else { return n * factorial(n - 1); } } 

n int , Any : . , factorial int ( Integer ). factorial , factorial factorial , ! ?

Bottom


Bottom :



┬л , , ┬╗. Bottom factorial :



  • block0 . n Integer , 1 1 , n == 1 , true false .
  • true : return 1 .
  • false n - 1 n Integer .
  • factorial тАФ , Bottom .
  • * n: Integer factorial : Bottom Bottom .
  • return Bottom .
  • factorial 1 Bottom , 1 .
  • 1 factorial , Bottom .
  • Integer * 1 Integer .
  • return Integer .
  • factorial Integer 1 , Integer .
  • factorial , Integer . * n: Integer factorial: Integer , Integer , .

factorial Integer , , .

, . Bottom , , .

* :

  1. (n: Integer) * (factorial: Bottom)
  2. (n: Integer) * (factorial: 1)
  3. (n: Integer) * (factorial: Integer)

multiplied , O( ) . , , .


тАФ , ┬л ┬╗. , (┬л ┬╗), , (┬л ┬╗). .

main :

 static int main(int n){ int count = 0, total = 0, multiplied = 0; while(count < n){ if (multiplied > 100) count += 1; count += 1; multiplied *= 2; total += 1; } return count; } 

, if (multiplied > 100) multiplied *= count multiplied *= 2 . .


, :

  • multiplied > 100 true , count += 1 (┬л┬╗).
  • total , (┬л┬╗).

, :

 static int main(int n){ int count = 0; while(count < n){ count += 1; } return count; } 

, .

:



, , : block0 , block1 , , block1b , , block1c , , return block3 .


, multiplied -> 0 , :



:



, block1b ( 0 > 100 ) true . false block1c ( if ):



, ┬л ┬╗ total > , - , , . , return , : > , 100 , 0 block1b , total , 0 , + 1 , total block0 block2 . :



┬л┬╗ :

 static int main(int n){ int count = 0; while(count < n){ count += 1; } return count; } 

рдирд┐рд╖реНрдХрд░реНрд╖


:

  • -.
  • , .
  • , . .
  • : ┬л┬╗ ┬л┬╗ , , .
  • : , .
  • , .

, , .

, . . , :

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


All Articles