рдЬрд╛рд╡рд╛ рдореЗрдВ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреИрд╕реЗ рди рд▓рд┐рдЦреЗрдВ

рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдПрдХ рдмрд╛рд░ рдПрдХ рд╣рдм рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рдерд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рд░рд╣рд╛ред рдиреАрдЪреЗ рдкреВрд░рд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИред



рдпрд╣ рд▓реЗрдЦ " рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ? " рд▓реЗрдЦ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдХреЛрдб рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдВрдд рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░реВрдВрдЧрд╛ред



рдпрджрд┐ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╢рд╛рдпрдж рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЗрд╕:

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







рдЪрд▓реЛ рдЗрд╕реЗ рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ (рд╣рдо рдЕрднреА рднреА рдЬрд╛рд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ), рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╣рд╛рдпрдХ (* рдпреВрдЯрд┐рд▓) рд╡рд░реНрдЧ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 public class FactorialUtil { public static int factorial(int n) { if (n == 0) return 1; return n * factorial(n-1); } }
      
      







рд╕рд░рд▓, рд╣реИ рдирд╛?



рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рднреА рд╣реИ:

 public class FactorialUtil { public static int factorial(int n) { int ret = 1; for (int i = 1; i <= n; ++i) ret *= i; return ret; } }
      
      







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

 public class FactorialUtil { public static BigInteger factorial(int n) { BigInteger ret = BigInteger.ONE; for (int i = 1; i <= n; ++i) ret = ret.multiply(BigInteger.valueOf(i)); return ret; } }
      
      







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

 public class FactorialUtil { static HashMap<Integer,BigInteger> cache = new HashMap<Integer,BigInteger>(); public static BigInteger factorial(int n) { BigInteger ret; if (n == 0) return BigInteger.ONE; if (null != (ret = cache.get(n))) return ret; ret = BigInteger.valueOf(n).multiply(factorial(n-1)); cache.put(n, ret); return ret; } }
      
      







рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛?

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



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

 public class FactorialUtil { private static FactorialUtil singleton; private FactorialAlgorithm algorithm; /** * Default (internal) constructor constructs our default algorithm. */ private FactorialUtil() { algorithm = new CachedFactorialImplementation(); } /** * New initializer which allows selection of the algorithm mechanism * @param algorithm */ public FactorialUtil(FactorialAlgorithm a) { algorithm = a; } /** * Default public interface for handling our factorial algorithm. Uses * the old standard established earlier for calling into our utility class. * @param n * @return */ public static BigInteger factorial(int n) { if (singleton == null) { // Use default constructor which uses default algorithm singleton = new FactorialUtil(); } return singleton.doFactorial(n); } /** * New mechanism which allows us to instantiate individual factorial * utilitiy classes and invoke customized factorial algorithms directory. * @param n * @return */ private BigInteger doFactorial(int n) { // Defer to our algorithm return algorithm.factorial(n); } }
      
      







рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдиреЗ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд░реНрдЧ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдирд┐рдЬреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рд╣реИ рдЬреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд░реНрдЧ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреАред



рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

 public interface FactorialAlgorithm { BigInteger factorial(int n); }
      
      







рдФрд░ рдпрд╣рд╛рдБ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдо рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛:

 public class CachedFactorialImplementation implements FactorialAlgorithm { static HashMap<Integer,BigInteger> cache = new HashMap<Integer,BigInteger>(); @Override public BigInteger factorial(int n) { BigInteger ret; if (n == 0) return BigInteger.ONE; if (null != (ret = cache.get(n))) return ret; ret = BigInteger.valueOf(n).multiply(factorial(n-1)); cache.put(n, ret); return ret; } }
      
      







рджреЗрдЦреЛ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХрд┐рддрдиреА рд╕реБрдВрджрд░ рд╣реИ! рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЧреИрд░-рдХреИрд╢рд┐рдВрдЧ рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 public class LoopedFactorialImplementation implements FactorialAlgorithm { @Override public BigInteger factorial(int n) { BigInteger ret = BigInteger.ONE; for (int i = 1; i <= n; ++i) ret = ret.multiply(BigInteger.valueOf(i)); return ret; } }
      
      







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

  public static void main(String[] args) { System.getProperties().setProperty("com.chaosinmotion.factorialalgorithm", "cachedAlgorithm"); System.out.println("5! = " + FactorialUtil.factorial(5)); }
      
      







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



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

 /** * Factory class manages the factorial algorithms in our system. * @author wwoody * */ public class FactorialAlgorithmFactory { private static HashMap<String,FactorialAlgorithm> mapping = new HashMap<String,FactorialAlgorithm>(); private static HashMap<String,Class<? extends FactorialAlgorithm>> classMapping = new HashMap<String,Class<? extends FactorialAlgorithm>>(); private static FactorialAlgorithm defaultAlgorithm = new CachedFactorialImplementation(); /** Static initializer registers some of my known classes */ static { try { Class.forName("com.chaosinmotion.factorial.LoopedFactorialImplementation"); Class.forName("com.chaosinmotion.factorial.CachedFactorialImplementation"); } catch (ClassNotFoundException e) { // Should never happen. } } /** Get the default algorithm for computing factorials */ public static FactorialAlgorithm getDefaultAlgorithm() { if (defaultAlgorithm == null) { // Warning: this will fail if for whatever reason CachedFactorialImplementation // is not in the class path. defaultAlgorithm = getAlgorithm("cachedAlgorithm"); } return defaultAlgorithm; } /** Get the factorial algorithm specified by name */ public static FactorialAlgorithm getAlgorithm(String name) { FactorialAlgorithm f = mapping.get(name); if (f == null) { // We haven't created an instance yet. Get it from the class mapping. Class<? extends FactorialAlgorithm> c = classMapping.get(name); if (c != null) { // Create a new instance of the factorial algorithm specified try { f = c.newInstance(); mapping.put(name, f); return f; } catch (Exception e) { // Log the error Logger.getLogger("com.chaosinmotion.factorial"). warning("Unable to instantiate algorithm " + c.getCanonicalName() + ", named " + name); } } return getDefaultAlgorithm(); // return something. } else return f; } /** Register the class so we can construct a new instance if not already initialized */ public static void registerAlgorithm(String name, Class<? extends FactorialAlgorithm> f) { classMapping.put(name, f); } }
      
      







рд╣рдо FactorialUtil рд╡рд░реНрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдирд╛рдорд╛рдВрдХрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ:

 public class FactorialUtil { private static FactorialUtil singleton; private FactorialAlgorithm algorithm; /** * Default (internal) constructor constructs our default algorithm. */ private FactorialUtil() { String name = System.getProperty("com.chaosinmotion.factorialalgorithm", "cachedAlgorithm"); if (name == null) { algorithm = FactorialAlgorithmFactory.getDefaultAlgorithm(); } else { algorithm = FactorialAlgorithmFactory.getAlgorithm(name); } } /** * New initializer which allows selection of the algorithm mechanism * @param algorithm */ public FactorialUtil(FactorialAlgorithm a) { algorithm = a; } /** * Utility to create by name. Calls into FactorialAlgorithmFactory to * actually get the algorithm. * @param name */ public FactorialUtil(String name) { algorithm = FactorialAlgorithmFactory.getAlgorithm(name); } /** * Default public interface for handling our factorial algorithm. Uses * the old standard established earlier for calling into our utility class. * @param n * @return */ public static BigInteger factorial(int n) { if (singleton == null) { // Use default constructor which uses default algorithm singleton = new FactorialUtil(); } return singleton.doFactorial(n); } /** * New mechanism which allows us to instantiate individual factorial * utilitiy classes and invoke customized factorial algorithms directory. * @param n * @return */ private BigInteger doFactorial(int n) { // Defer to our algorithm return algorithm.factorial(n); } }
      
      







рд╣рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХреИрд╢реНрдбрдлреИрдХреНрдЯреЛрд░рд┐рдпрд▓ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдФрд░ рд▓реВрдкреЗрдб рдлрд╝реИрдХреНрдЯреАрд░рд┐рдпрд▓ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреНрд▓рд╛рд╕реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдлреИрдХреНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ:

 public class CachedFactorialImplementation implements FactorialAlgorithm { static HashMap<Integer,BigInteger> cache = new HashMap<Integer,BigInteger>(); static { FactorialAlgorithmFactory.registerAlgorithm("cachedAlgorithm", CachedFactorialImplementation.class); } @Override public BigInteger factorial(int n) { BigInteger ret; if (null != (ret = cache.get(n))) return ret; ret = BigInteger.valueOf(n).multiply(factorial(n-1)); cache.put(n, ret); return ret; } }
      
      







рдФрд░



 public class LoopedFactorialImplementation implements FactorialAlgorithm { static { FactorialAlgorithmFactory.registerAlgorithm("loopedAlgorithm", LoopedFactorialImplementation.class); } @Override public BigInteger factorial(int n) { BigInteger ret = BigInteger.ONE; for (int i = 1; i <= n; ++i) ret = ret.multiply(BigInteger.valueOf(i)); return ret; } }
      
      







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

 public class RecursiveFactorialImplementation implements FactorialAlgorithm { static { FactorialAlgorithmFactory.registerAlgorithm("recursiveAlgorithm", RecursiveFactorialImplementation.class); } @Override public BigInteger factorial(int n) { if (n == 0) return BigInteger.ONE; return BigInteger.valueOf(n).multiply(factorial(n-1)); } }
      
      







рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рднрд░реА рд╣реБрдИ рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЧреБрдг рд╕реЗрдЯ рдХрд░реЗрдВред

  public static void main(String[] args) { try { Class.forName("com.chaosinmotion.factorial.RecursiveFactorialImplementation"); } catch (ClassNotFoundException e) { // if this fails, no matter; we'll still use the default implementation. } System.getProperties().setProperty("com.chaosinmotion.factorialalgorithm", "recursiveAlgorithm"); System.out.println("5! = " + FactorialUtil.factorial(5)); }
      
      







рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпреЗ ред



separator.png








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



рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреА рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдкреВрд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдиреЛрдЯреНрд╕ рд▓рд┐рдЦреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмреНрд▓реЙрдЧ рд╕реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЙрдкреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╣рд╛рдБ, рдпрд╣ рд╕рдм рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдорд╢реАрди рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ)ред



рд▓реЗрдХрд┐рди рд╣реЗ, рдпрд╣рд╛рдБ рдЕрдВрдд рдореЗрдВ рдореЗрд░рд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИ



рдпрд╣ рд╕рдм рдмрдХрд╡рд╛рд╕ рд╣реИред



рдкреНрд░рддреНрдпреЗрдХ рдФрд░ рд╣рд░ рдкрдВрдХреНрддрд┐ред



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



рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХреБрдЫ рджреЗрдЦрд╛ рд╣реИ? рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХреБрдЫ рджреЗрдЦрд╛ рд╣реИ?



рд╣рдордиреЗ рдХрднреА рднреА рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд░рдЦрд╛ рд╣реИред



separator.png








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



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

 static double Gamma(double z) { double tmp1 = Math.sqrt(2*Math.PI/z); double tmp2 = z + 1.0/(12 * z - 1.0/(10*z)); tmp2 = Math.pow(z/Math.E, z); // ooops; thanks hj tmp2 = Math.pow(tmp2/Math.E, z); return tmp1 * tmp2; }
      
      







рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рднреА рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред



separator.png








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



рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдХрднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛, рд╣реИ рдирд╛?



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



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



separator.png








рддреЛ рдХреГрдкрдпрд╛ рд╣рдо рд╕рднреА рдкрд░ рдПрдХ рдПрд╣рд╕рд╛рди рдХрд░реЗрдВ: рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ "рдХрд┐рд╕реА рджрд┐рди рдпрд╣ рдХрд╛рдо рдЖрдПрдЧрд╛" рдпрд╛ "рд╕рд┐рд╕реНрдЯрдо рдЕрднреА рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИ" рдпрд╛ "рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП" рдпрд╛ (рдордд рджреЗрдирд╛ рднрдЧрд╡рд╛рди!) рдХреНрдпреЛрдВрдХрд┐ "рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ" - рдмрд╕ рдШрд░ рдЬрд▓реНрджреА рдЬрд╛рдУред рдХрд╛рд░реНрдЯреВрди рджреЗрдЦреЗрдВред рдпрд╛ " рдкреНрд░рд╛рд░рдВрдн " рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдВред



рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдВред










All Articles