рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬреАрддреЗрдВ, рд╕рд╛рде рд╣реА рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдВрддрд╣реАрди рдзрд╛рд░рд╛рдПрдВ

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

рдлреВрдЯ рдбрд╛рд▓реЛ рдФрд░ рдЬреАрддреЛ


рд╕рдВрднрд╡рддрдГ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ "рдбрд┐рд╡рд╛рдЗрдб рдПрдВрдб рдХреЙрдирдХрд░" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдХрдИ рдмрд╛рд░ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ , рддреЛ рдЙрд╕реЗ рддреБрд░рдВрдд рд╣рд▓ рдХрд░реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдЫреЛрдЯреА "рдЙрдк-рд╕рдорд╕реНрдпрд╛рдУрдВ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдРрд╕рд╛ рддрдм рддрдХ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреНрд░рд╛рдердорд┐рдХ рди рд╣реЛрдВред рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХрдиреЗрдХреНрдЯ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдорд╕реНрдпрд╛ рдХреЛ (рдФрд░ рд╕рднреА рдЙрдк-рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ) рдЯрд╛рдЗрдк p , рдФрд░ рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк s ред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди divideAndConquer рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк p рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдк s рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ (= divideAndConquer рддрддреНрд╡реЛрдВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ divideAndConquer рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:

 indiv :: p -> Bool 
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ: "рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдИ рдЙрдк-рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?" рдпрджрд┐ рд╣рд╛рдБ, рддреЛ True рдкрд░ рд▓реМрдЯреЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕реЗ solve рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 solve :: p -> s 
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдердорд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк s рдХрд╛ рд╕рдорд╛рдзрд╛рди рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред

 divide :: p -> [p] 
рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрдИ рдЙрдк-рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдПрдХ рд╕рдорд╕реНрдпрд╛ p рд╣рдо рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ [p] , рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

 combine :: p -> [s] -> s 
рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ p рдХреНрдпреЛрдВ рдкреВрдЫрддреЗ рд╣реИрдВ? рдХрднреА-рдХрднреА, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдо рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)ред

рддреЛ рдпрд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ divideAndConquer divideAndConquer рджрд┐рдЦрддрд╛ divideAndConquer ? рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 divideAndConquer :: (p -> Bool) -> (p -> s) -> (p -> [p]) -> (p -> [s] -> s) -> p -> s 

рдпрд╛рдиреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЪрд╛рд░ рдореВрд▓ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд┐рднрд╛рдЬрди рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдк s рдХрд╛ рд╣рд▓ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рд╣реА рд╣реИ:
 divideAndConquer :: (p -> Bool) -> (p -> s) -> (p -> [p]) -> (p -> [s] -> s) -> p -> s divideAndConquer indiv solve divide combine initPb = dAC initPb where dAC pb | indiv pb = solve pb | otherwise = combine pb (map dAC (divide pb)) 

рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ (pb) рдХреЛ рдЫреЛрдЯреА рдЙрдк-рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ indiv pb = solve pb ред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ quickSort рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ quickSort ред рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЙрди рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░рдордмрджреНрдз рдХреНрд░рдо рдореЗрдВ:
 quickSort :: Ord a => [a] -> [a] 


рдЕрдм рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП divideAndConquer рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╣рдорд╛рд░реЗ рдЪрд╛рд░ рддрддреНрд╡реЛрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рддрдм рдЕрд╡рд┐рднрд╛рдЬреНрдп (= indiv) рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ 1 рд╕реЗ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИред рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди (= рд╣рд▓) рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ 1 рд╣реИ, рддреЛ рдпрд╣ рд╕рд░рдгреА рдХреНрд░рдордмрджреНрдз рд╣реИред рдЖрдк рдПрдХ рд╕рд░рдгреА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд (= рд╡рд┐рднрд╛рдЬрд┐рдд) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реЗ рд▓реЛ рдФрд░ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ - рдПрдХ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде <= рдкрд╣рд▓рд╛ рддрддреНрд╡ рдХрд╛, рджреВрд╕рд░рд╛ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде> рдкрд╣рд▓рд╛ рддрддреНрд╡ рдХрд╛ред рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ (= рдЧрдардмрдВрдзрди) рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ: рдкрд╣рд▓рд╛ рддрддреНрд╡ рдордзреНрдп рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╕рднреА рдЗрд╕ рддрддреНрд╡ рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрдВ, рдФрд░ рджрд╛рдИрдВ рдУрд░ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЗрд╕ рддрддреНрд╡ рд╕реЗ рдмрдбрд╝реА рд╣реИрдВред
DivideAndConquer рдХреЗ рдореБрдЦреНрдп рдЪрд╛рд░ рдШрдЯрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 quickSort :: Ord a => [a] -> [a] quickSort lst = divideAndConquer indiv solve divide combine lst where indiv ls = length ls <= 1 solve = id divide (l:ls) = [[x | x <- ls, x <= l], [x | x <- ls, x > l]] combine (l:_) [l1,l2] = l1 ++ [l] ++ l2 


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рди рдХреЗрд╡рд▓ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рднреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд░реНрдЬрд╕реЙрд░реНрдЯ (рдФрд░ рди рдХреЗрд╡рд▓ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП)ред рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд▓рдд рдордд рд╕рдордЭрд┐рдП рдХрд┐ рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рдЬреАрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рд░реЛрд╣ рдлрд┐рдмреЛрдирд╛рдЪреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ nth рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИ:
 fib :: Integer -> Integer fib n = divideAndConquer indiv solve divide combine n where indiv n = (n==0) || (n==1) solve n | n == 0 = 0 | n == 1 = 1 | otherwise = error "Input argument must be >= 0" divide n = [n-2, n-1] combine _ [l1,l2] = l1 + l2 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШрд╛рддреАрдп рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╣реИрдВред

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

divideAndConquer рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ 4 indiv, solve, divide, combine рд╣реЛрддреЗ рд╣реИрдВ: indiv, solve, divide, combine ред рдпрджрд┐ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ "рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдЬреАрддрдирд╛" рд╣рдореЗрд╢рд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдЕрдВрддрд╣реАрди рдзрд╛рд░рд╛рдПрдБ


рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрд╣реАрди рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдзрд╛рд░рд╛ "рдЕрдирдВрдд рд╕рд░рдгреА" рдХрд╛ рдкрд░реНрдпрд╛рдп рд╣реИ (рд╕рдВрд▓рдЧреНрди рдЖрд▓рд╕реА рд╕реВрдЪреА)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [1..] рд╕рднреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдРрд╕реА рдзрд╛рд░рд╛рдПрдБ рдЖрдкрдХреЛ "рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
рдЖрдЗрдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА primes (= primes рдХреА рдзрд╛рд░рд╛) рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдПрд░рд╛рдЯреЛрд╕реНрдердиреАрдЬ рдХреА рдЫрд▓рдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рдореБрдЦ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рджреЛ рд╕реЗ "рдЕрдирдВрдд" рддрдХ рд╕рднреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдмрд╛рдИрдВ рдУрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рднреА рд╣рдо рдПрдХ рдЕрднрд╛рдЬреНрдп рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рд╣рдо рд╕реВрдЪреА рд╕реЗ рдЙрди рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╢реЗрд╖ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рднрд╛рдЬреНрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдХреЗ рд╕рд╛рде рд╢реБрд░реВ:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11...
рд╕рдВрдЦреНрдпрд╛ 2 рдЕрднрд╛рдЬреНрдп рд╣реИ, рдЙрди рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВ рдЬреЛ 2 рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рд╣реИрдВ:
2, 3, 5, 7, 9, 11...
рд╕рдВрдЦреНрдпрд╛ 3 рдкреНрд░рдзрд╛рди рд╣реИ, рдЙрди рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ 3 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
2, 3, 5, 7, 11...
рдЖрджрд┐

рдЪрд▓рдиреА (= рдЫрд▓рдиреА) рдПрдХ рд╕рд░рдгреА рд▓реЗрддреА рд╣реИ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдСрдкрд░реЗрд╢рди рдХрд░рддреА рд╣реИ:
 sieve :: [Integer] -> [Integer] sieve (x:xs) = x : sieve [y | y <- xs, mod yx > 0] 


рдЕрдм primes (= primes) рдХреА рдзрд╛рд░рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 primes :: [Integer] primes = sieve [2..] 

рдЕрдм, рдЬрдм рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ primes рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП primes рд╣реЛрдВрдЧреЗред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
primes
->> sieve [2..]
->> 2 : sieve [y | y <- [3..], mod y 2 > 0]
->> 2 : 3 : sieve [z | z <- [y | y <- [4..], mod y 2 >0], mod z 3 > 0]
->> ...
->> 2 : 3 : sieve [ z | z <- [5, 7, 9..], mod z 3 > 0]
->> ...
->> 2 : 3 : sieve [5, 7, 11, ...
->> ...

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

"рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ" рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд, рдЬреЛ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд┐рдореНрд╕ рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╕рдмрд╕реЗрдЯ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯ: filter (<10) primes ->> [2,3,5,7, рдХрднреА рднреА рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ 10 рд╕реЗ рдХрдо рд╣реЛрдЧреА рдпрд╛ рдирд╣реАрдВ рдФрд░ рдЙрдирдХреА рдЦреЛрдЬ рдЬрд╛рд░реА рд╣реИред рдмрдврд╝рддреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: takeWhile (<10) primes ->> [2,3,5,7] ред

"рдкрд░рд┐рд╡рд░реНрддрди" рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд, рдЬреЛ рдзрд╛рд░рд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

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

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

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


All Articles