рд╢реБрдн рджреЛрдкрд╣рд░, рд╣рдмреНрд░!
рдЗрд╕ рджрд┐рдЦрд╛рд╡рдЯреА рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде, рдореИрдВ рдХрдИ рдХрд▓рди рдореЙрдбрд▓ (
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдореЙрдбрд▓) -
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ (рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддреГрдд рд╣реИ) рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдШрдЯрдХ (рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡рд░реНрддрди), рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╕реНрдХрд╛рд▓рд╛ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореЙрдбрд▓ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
1. рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп - рдпрд╣ рдХреНрдпрд╛ рд╣реИ?
рд╣рд░ рдХреЛрдИ рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди" рдЬрд╛рдирддрд╛ рд╣реИ - рдПрдХ рдмреНрд░рд┐рдЯрд┐рд╢ рдЧрдгрд┐рддрдЬреНрдЮ, рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░реА, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд░ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдЪреНрдЫреЗ рд╡реНрдпрдХреНрддрд┐
рдПрд▓рди рдЯреНрдпреВрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдХрд▓рди рдореЙрдбрд▓ред рдпрд╣ рдореЙрдбрд▓
рдХрдИ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд▓рди рдореЙрдбрд▓ рдореЗрдВ
рд╕реЗ рдПрдХ рд╣реИ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдиреНрдп рдореЙрдбрд▓ рдЬреИрд╕реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдФрд░ рдореНрдпреВ рд░рд┐рдХрд░реНрд╕рди рдХреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ рднреА, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИ?
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЕрдореВрд░реНрдд рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИ рдЬреЛ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдШрдЯрд╛рдирд╛, рдЕрдВрддрд░ рдХрд░рдирд╛ рдФрд░ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди (рдЕрднреА рддрдХ) рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдРрд╕реА рдорд╢реАрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ? рдХреИрд╕реЗ рдЙрд╕реЗ рдЧрд┐рдирддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП?
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдорд╢реАрди рдХреЗ рдкрд╛рд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
- рдмреБрдирд┐рдпрд╛рджреА рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ:
- рд╢реВрдиреНрдп (x) = 0: рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдП рдЧрдП рддрд░реНрдХ x рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди 0 рджреЗрддрд╛ рд╣реИ
- Succ (x) = x + 1: рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдП рдЧрдП x рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди x + 1 рджреЗрддрд╛ рд╣реИ
- рдкреНрд░рдХреНрд╖реЗрдкрдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рд╡рд╛рд░
рдЬрд╣рд╛рдБ
: рдХрд┐рд╕реА рднреА n рддрд░реНрдХ рдХреЗ рд▓рд┐рдП m рд╕реНрдерд┐рддрд┐ рдкрд░ рдЦрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред
- рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ (рд╕реБрдкрд░рдкреЛрдЬрд┐рд╢рди): (f тАв g) (x) = f (g (x));
- рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡рд░реНрддрди: рдПрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди f (X1, x2, ..., xn) рд╣реЛ рдФрд░ n / 2 рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди g (X1, X2, ..., Xn, Xn + 1, Xn + 2) рд╣реЛред ред рддрдм рд╣рдо n + 1 рдЪрд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди h (X1, X2, .... Xn, Xn + 1) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
h (X1, X2, ..., Xn, 0) = f (X1, X2, ..., Xn);
h (X1, X2, ..., Xn, i + 1) = g (X1, X2, ..., Xn, i, h (X1, X2, ..., Xn, i));
рд╡рд╣ рд╕рдм рдЬреЛ рд╣рдорд╛рд░рд╛ рдЕрдореВрд░реНрдд рдХрдВрдкреНрдпреВрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд, рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдпрд╣ рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИред рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП a рдФрд░ b:
рд╕рдо (рдП, рдмреА):
рд╕рдо (a, 0) = I (a);
Sum (a, i + 1) = Succ (F (a, i, Sum (, i))) рдЬрд╣рд╛рдБ F рддреАрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ F, Sum (a, i) рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛;
рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рд╣рдо рджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢ рд╣реИрдВред
рд╡реИрд╕реЗ, рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ, рд╕реБрдо (рдП, рдЖрдИ + 1) рдХреЛ рдкреЗрдВрдЯ рдХрд░рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рд╕рд┐рд░реНрдл рд╕реБрдо (рдП, рдЖрдИ + 1) = рд╕реБрдХ (рд╕реБ (рдП, рдЖрдИ)) рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рд╣реИред рдореИрдВ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реВрдВ: рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рднреА рд╣реИ), рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рддрд░реНрдХ рднреА, рдПрдХ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ i) рд╕реЗ рдХрдо рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╕рдо ( , рдореИрдВ)ред рдпрд╣ рдЧреИрд░-рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ (рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реНрдХреЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдЙрд╕реА рддрд░рд╣ рд╣рдо рдирд┐рд╖реЗрдз, рдбрд┐рдЧреНрд░реА рдЖрджрд┐ рдХрд╛ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рдЕрдирдВрдд рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
F = {f0, f1, f2, f3, ...} рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЕрдирдВрдд рдЧрдгрдиреАрдп рд╕реЗрдЯ рд╣реИ:
f0 (0, y) = Succ (y);
f [n + 1] (x, y): f [n + 1] (0, y) = y; f [n + 1] (i + 1, y) = fn (y, f [n + 1] (i, y));
рдпрд╣ рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИред
рдореИрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЬреАрддрд╛ рдФрд░ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐
╬╝- рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреНрдпрд╛
рд╣реИ , рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ ... рдЧрдгрд┐рдд рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ!
2. рд╕реНрдХреЗрд▓рд╛ рдкрд░ рдЖрджрд┐рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ MyNumber:
abstract class MyNumber { val isNatural: Boolean val isNeg: Boolean val isZero: Boolean val isInf: Boolean def +(b: MyNumber): MyNumber def -(b: MyNumber): MyNumber def *(b: MyNumber): MyNumber def /(b: MyNumber): MyNumber def ^(b: MyNumber): MyNumber def <(b: MyNumber): Boolean def >(b: MyNumber): Boolean def ==(b: MyNumber): Boolean def neg: MyNumber def abs: MyNumber def pre: MyInteger def suc: MyInteger val num: MyInteger val denum: MyInteger def gcd(b: MyNumber): MyNumber def mod(b: MyInteger): MyNumber override def toString(): String def toInteger: MyInteger = if(isNatural) this.asInstanceOf[MyInteger] else (num / denum).asInstanceOf[MyInteger] def toFraction: Fraction = if(isNatural) new Fraction(this.toInteger) else this.asInstanceOf[Fraction] }
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдмрд╛рд▓ рд╡рд░реНрдЧ, рдЕрдВрд╢ рдФрд░ MyInteger рд╣реЛрдВрдЧреЗ:
abstract class MyInteger extends MyNumber { val isNatural = true val isNeg: Boolean val isZero: Boolean val isInf: Boolean def +(b: MyNumber): MyNumber = if (b.isNatural) this plusInt b.toInteger else this plusFrac b.toFraction protected def plusInt(b: MyInteger): MyNumber private def plusFrac(b: Fraction): MyNumber = this.toFraction + b def -(b: MyNumber): MyNumber = if (b.isNatural) this minusInt b.toInteger else this minusFrac b.toFraction protected def minusInt(b: MyInteger): MyNumber private def minusFrac(b: Fraction): MyNumber = this.toFraction - b def *(b: MyNumber): MyNumber = if (b.isNatural) this multInt b.toInteger else this multFrac b.toFraction protected def multInt(b: MyInteger): MyNumber private def multFrac(b: Fraction): MyNumber = this.toFraction * b def /(b: MyNumber): MyNumber = if (b.isNatural) this divInt b.toInteger else this divFrac b.toFraction protected def divInt(b: MyInteger): MyNumber private def divFrac(b: Fraction): MyNumber = this.toFraction / b def ^(b: MyNumber): MyNumber = if (b.isNatural) this powInt b.toInteger else this powFrac b.toFraction protected def powInt(b: MyInteger): MyNumber protected def powFrac(b: Fraction): MyNumber
Integer рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЦреНрдпрд╛ (Suc), рдкрд┐рдЫрд▓реА (Pre), рд╢реВрдиреНрдп (рд╢реВрдиреНрдп) рдФрд░ рдЕрдирдВрдд (PosInf) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
class Zero extends MyInteger { val isZero = true val isNeg = false val isInf = false protected def plusInt(b: MyInteger): MyNumber = b protected def minusInt(b: MyInteger): MyNumber = b neg protected def multInt(b: MyInteger): MyNumber = this protected def divInt(b: MyInteger): MyNumber = if (b.isZero) new PosInf else if(b.isInf) new Zero else this protected def powInt(b: MyInteger): MyNumber = this.suc protected def powFrac(b: Fraction): MyNumber = this.suc protected def lessThanInt(b: MyInteger): Boolean = !b.isNeg && !b.isZero protected def biggerThanInt(b: MyInteger): Boolean = b.isNeg && !b.isZero protected def equalsInt(b: MyInteger): Boolean = b.isZero def pre: MyInteger = new Pre(this) def suc: MyInteger = new Suc(this) def neg = this } class PosInf extends MyInteger { val isZero = false val isNeg = false val isInf = true protected def plusInt(b: MyInteger): MyNumber = this protected def minusInt(b: MyInteger): MyNumber = this protected def multInt(b: MyInteger): MyNumber = this protected def divInt(b: MyInteger): MyNumber = this protected def powInt(b: MyInteger): MyNumber = this protected def powFrac(b: Fraction): MyNumber = this protected def lessThanInt(b: MyInteger): Boolean = false protected def biggerThanInt(b: MyInteger): Boolean = true protected def equalsInt(b: MyInteger): Boolean = b.isInf def pre: MyInteger = this def suc: MyInteger = this def neg = this } class Pre(nb: MyInteger) extends MyInteger { val isZero = false val isNeg = true val isInf = false protected def plusInt(b: MyInteger): MyNumber = { def iter(b: MyInteger, accu: MyNumber): MyNumber = { if (b isNeg) this - (b neg) else if (b isZero) accu else iter(b.pre, accu.suc) } iter(b, this) } protected def minusInt(b: MyInteger): MyNumber = { def iter(b: MyInteger, accu: MyNumber): MyNumber = { if (b isNeg) (this + (b neg)) else if (b isZero) accu else iter(b.pre, accu.pre) } iter(b, this) } protected def multInt(b: MyInteger): MyNumber = { (this.neg * b).neg } protected def divInt(b: MyInteger): MyNumber = if (b.isZero) new PosInf else if(b.isInf) new Zero else if (b.isNeg) this.abs / b.abs else (this.abs / b).neg protected def powInt(b: MyInteger): MyNumber = if(b!=new Zero)(this.neg ^ b).neg else (new Zero).suc protected def powFrac(b: Fraction): MyNumber = (new Zero).pre //TODO protected def lessThanInt(b: MyInteger): Boolean = { def iter(a: MyInteger, b: MyInteger): Boolean = a.isZero || b.isZero match { case true => !(a isZero) && (b isZero) case false => iter(a.suc, b.suc) } if (!b.isNeg || b.isZero) true else iter(this, b) } protected def biggerThanInt(b: MyInteger): Boolean = { def iter(a: MyInteger, b: MyInteger): Boolean = a.isZero || b.isZero match { case true => (a isZero) && !(b isZero) case false => iter(a.suc, b.suc) } if (!b.isNeg || b.isZero) false else iter(this, b) } protected def equalsInt(b: MyInteger): Boolean = !(this < b) && !(this > b) def pre: MyInteger = new Pre(this) def suc: MyInteger = nb def neg = { def iter(nb: MyInteger, accu: MyInteger): MyInteger = { if (nb isZero) accu else iter(nb.suc, accu.suc) } iter(this, new Zero) } } class Suc(nb: MyInteger) extends MyInteger { val isZero = false val isNeg = false val isInf = false protected def plusInt(b: MyInteger): MyNumber = { def iter(b: MyInteger, accu: MyNumber): MyNumber = { if (b isNeg) this - (b neg) else if (b isZero) accu else iter(b.pre, accu.suc) } iter(this, b) } protected def minusInt(b: MyInteger): MyNumber = { def iter(b: MyInteger, accu: MyNumber): MyNumber = { if (b isNeg) this + (b neg) else if (b isZero) accu else iter(b.pre, accu.pre) } iter(b, this) } protected def multInt(b: MyInteger): MyNumber = { def iter(a: MyInteger, b: MyInteger, accu: MyNumber): MyNumber = { if (b.isZero) accu else iter(a, b.pre, accu + a) } if (b.isZero) new Zero else { if (this < b) { if (b.isNeg) iter(b.neg.toInteger, this, new Zero).neg else iter(b, this, new Zero) } else { if (b.isNeg) iter(this, b.neg.toInteger, new Zero).neg else iter(this, b, new Zero) } } } protected def divInt(b: MyInteger): MyNumber = { def iter(a: MyNumber, b: MyNumber, count: MyNumber): MyNumber = { if (a.isZero) count else if (a.isNeg) count.pre else iter(a - b, b, count.suc) } if (b.isZero) new PosInf else if(b.isInf) new Zero else if (b.isNeg) iter(this, b.abs, new Zero).neg else iter(this, b, new Zero) } protected def powInt(b: MyInteger): MyNumber = { def iter(a: MyInteger, b: MyInteger, accu: MyNumber): MyNumber = { if (b.isZero) accu else iter(a, b.pre, accu * a) } if (b.isZero) (new Zero).suc else { if (b.isNeg) new Fraction((new Zero).suc, iter(this, b.neg.toInteger, (new Zero).suc).toInteger) else new Fraction(iter(b, this, (new Zero).suc).toInteger) } } protected def powFrac(b: Fraction): MyNumber = (new Zero).pre //TODO protected def lessThanInt(b: MyInteger): Boolean = { def iter(a: MyInteger, b: MyInteger): Boolean = a.isZero || b.isZero match { case true => (a isZero) && !(b isZero) case false => iter(a.pre, b.pre) } if (b.isNeg || b.isZero) false else iter(this, b) } protected def biggerThanInt(b: MyInteger): Boolean = { def iter(a: MyInteger, b: MyInteger): Boolean = a.isZero || b.isZero match { case true => !(a isZero) && (b isZero) case false => iter(a.pre, b.pre) } if (b.isNeg || b.isZero) true else iter(this, b) } protected def equalsInt(b: MyInteger): Boolean = !(this < b) && !(this > b) def pre: MyInteger = nb def suc: MyInteger = new Suc(this) def neg = { def iter(nb: MyInteger, accu: MyInteger): MyInteger = { if (nb isZero) accu else iter(nb.pre, accu.pre) } iter(this, new Zero) } }
рдЕрдВрд╢ рд╡рд░реНрдЧ рдХреБрдЫ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ MyInteger рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:
class Fraction(x: MyInteger, y: MyInteger) extends MyNumber { def this(x: MyInteger) = this(x, (new Zero).suc) val isNatural: Boolean = false val isNeg: Boolean = (x.isNeg && !y.isNeg) || (!x.isNeg && y.isNeg) val isZero: Boolean = x.isZero val isInf: Boolean = x.isInf || y.isInf def +(b: MyNumber): MyNumber = this plus b.toFraction private def plus(b: Fraction): MyNumber = new Fraction((this.num * b.denum + this.denum * b.num).toInteger, (this.denum * b.denum).toInteger) def -(b: MyNumber): MyNumber = this minus b.toFraction private def minus(b: Fraction): MyNumber = new Fraction((this.num * b.denum - this.denum * b.num).toInteger, (this.denum * b.denum).toInteger) def *(b: MyNumber): MyNumber = this mult b.toFraction private def mult(b: Fraction): MyNumber = new Fraction((this.num * b.num).toInteger, (this.denum * b.denum).toInteger) def /(b: MyNumber): MyNumber = this div b.toFraction private def div(b: Fraction): MyNumber = new Fraction((this.num * b.denum).toInteger, (this.denum * b.num).toInteger) def ^(b: MyNumber): MyNumber = if (!b.isNatural) (new Zero).pre else new Fraction((this.num ^ b.toInteger).toInteger, (this.denum ^ b.toInteger).toInteger) def <(b: MyNumber): Boolean = if (this.num.isNeg) { if (b.num.isNeg) this.neg > b.neg else true } else if (this.isZero) { if (b.isZero || b.num.isNeg) false else true } else { if (b.num.isNeg || b.isZero) false else this.num * b.denum < this.denum * b.num } def >(b: MyNumber): Boolean = if(this.num.isNeg){ if(b.num.isNeg) this.neg < b.neg else false }else if(this.isZero){ if(b.isZero || !b.num.isNeg) false else true }else{ if(b.num.isNeg || b.isZero) true else this.num * b.denum > this.denum * b.num } def ==(b: MyNumber): Boolean = if(!b.isNatural)(this.num == b.num) && (this.denum == b.denum) else this == b.toFraction def neg: MyNumber = new Fraction(num.neg.toInteger, denum) def abs: MyNumber = new Fraction(num.abs.toInteger, denum) def pre: MyInteger = sys.error("Predicat of fraction") def suc: MyInteger = sys.error("Successor of fraction") val num = ((if(this.isNeg)x.abs.neg else x.abs) / (x.abs gcd y.abs)).toInteger val denum = (y.abs / (x.abs gcd y.abs)).toInteger def gcd(b: MyNumber): MyNumber = this.denum gcd (new Zero).suc def mod(b: MyInteger): MyNumber = new Zero override def toString(): String = if(num.isZero) 0.toString() else if(this.isInf) "" else if(denum == (new Zero).suc) num.toString() else num + "/" + denum }
рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ (рдЖрдк рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рджреЗрд╢реА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ!)
рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдирдИ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
abstract class MySet { def add(elem: MyNumber): MySet def delete(elem: MyNumber): MySet def union(set: MySet): MySet def intersec(set: MySet): MySet def contains(elem: MyNumber): Boolean def linearSearch(elem: MyNumber): MySet def mergeSort: MySet def merge: MySet def quickSort: MySet def timSort: MySet def binaryTreeSort: MySet def length: MyNumber def get(pos: MyNumber): MyNumber def take(n: MyNumber): MySet def drop(n: MyNumber): MySet def map(p: MyNumber => MyNumber): MySet def filter(p: MyNumber => Boolean): MySet def flat(p: (MyNumber, MyNumber) => MyNumber): MyNumber
рд╣рд╛рдВ, рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдкрдирд╛ рдмреНрд░рд╣реНрдорд╛рдВрдб рднреА рдмрдирд╛ рд╕рдХрддреА рд╣реИрдВред "рд▓рд╛рдареА рдФрд░ рд╡реЗрд╢реНрдпрд╛ рдХреЗ рд╕рд╛рдеред" рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред