рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдзреБрдирд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИрдВ: рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрдирдХреА рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрд╕реЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдХрд╛рд░реНрдп рдпрд╣ рд╕рдордЭрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рд╣реИ, рд╡рд╣ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддреЗрдЬреА рд╕реЗред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдореВрд▓ рдЕрдиреБрдорд╛рди рддрдХрдиреАрдХреЛрдВ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ: рдПрдХ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХреЗ; рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рдХрдЯреМрддреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдФрд░ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╣реАрдВ рднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдмрдбрд╝реЗ рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ (
рд╕реНрдХрд╛рд▓рд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ ) рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ; рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рдж рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ (
рдкреНрд░реЛрдЧрд╛рд░реНрдб ); рдпрд╛ рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди (
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; }
рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ, рдХреЛрдб рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рднрд╛рдЧ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдпрд╣
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)
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
, , .
*
:
(n: Integer) * (factorial: Bottom)
(n: Integer) * (factorial: 1)
(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; }
рдирд┐рд╖реНрдХрд░реНрд╖
:
- -.
- , .
- , . .
- : ┬л┬╗ ┬л┬╗ , , .
- : , .
- , .
, , .
, . . , :