рдПрдл # рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рд░реЗрдХред рднрд╛рдЧ 1


рд╡рд┐рдиреА рдж рдкреВрд╣: рдУрд╣, рдЖрдкрдХреА рдкреВрдВрдЫ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ?
Eeyore: рдЙрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рд╡рд┐рдиреА рдж рдкреВрд╣: рд╡рд╣ рдирд╣реАрдВ рд╣реИред
Eeyore: рддреБрдо рдЧрд▓рдд рдирд╣реАрдВ рдереЗ?
рд╡рд┐рдиреА рдж рдкреВрд╣: рдкреВрдВрдЫ рдпрд╛ рддреЛ рд╡рд╣рд╛рдБ рд╣реИ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ! рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред
Eeyore: рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ?
рд╡рд┐рдиреА рдж рдкреВрд╣: рдХреБрдЫ рдирд╣реАрдВ!

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рдЕрдЧрд▓реЗ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореЗрдореЛрд░реА рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрдиреЗ рд▓рдЧреАред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ рдХрд┐ .NET, F #, рдкреНрд░рдмрдВрдзрдХ рдХреЛрдб, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣, рд╕рднреА рдЪреАрдЬреЗрдВ, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд▓реАрдХ рд╣реЛ рдЧрдИ рд╣реИред рд░рд╛рддреЛрдВ рдХреА рдиреАрдВрдж рдФрд░ рдЦрд░рд╛рдм рд╣реБрдИ рдирд╕реЛрдВ рдХреА рдХреАрдордд рдкрд░, рд░рд┐рд╕рд╛рд╡ рдХрд╛ рд╕реНрд░реЛрдд рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рд╡рдЬрд╣ рд╕реЗ рдереА, рдЬреЛ рдХрд┐ рдПрдл # рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдХреЙрдкреА рдХреА рдЧрдИ рд▓рдЧрднрдЧ рдПрдХ рд╕реЗ рдПрдХ рдереАред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдерд╛, рдпрд╛ рдмрд▓реНрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рдХрд▓рд╛ рдерд╛ред

рдкреВрдВрдЫ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐


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

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

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

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

рдЖрдЗрдП рдкрд╣рд▓реЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдПрдХ рдирд┐рдпрдо рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк "рдкрд░реЗрд╢рд╛рдиреА" рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реЗ N рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ:
let rec sum i = if i <= 0L then 0L else i + sum (i - 1L) > sum 10L;; val it : int64 = 55L 

рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдм рдареАрдХ рд╣реИред рдпрджрд┐ рд╣рдо рдХрдо рд╕реЗ рдХрдо 100,000 рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдорд╛рдереЗ рдореЗрдВ рдПрдХ StackOverflowException рдорд┐рд▓рддреА рд╣реИред рдпрд╛рдиреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ:
 > sum 100000L;; Process is terminated due to StackOverflowException. 

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрддреНрддрд░ рдмреИрдЯрд░реА рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ:
 let sumTailRec i = let rec loop acc i = if i <= 0L then acc else loop (acc + i) (i - 1L) loop 0L i 

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

рдЧрдгрдирд╛ рдХреЗ рдХреНрд░рдо (рддрд░реНрдХ 5 рдХреЗ рд▓рд┐рдП) рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд┐рдирд╛ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐:
 sum: 5 + (4 + (3 + (2 + (1 + (0))))) тАУ       ,  ,      .         . 

рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде:
 sumTailRec: (((0 + 5) + 4) + 3) + 2) + 1) тАУ ,      ,       ,       . 

рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрдЪ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ int64 рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред
 > sumTailRec 10000000L;; val it : int64 = 50000005000000L 

рдЕрдм, рдереЛрдбрд╝рд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХреБрдЫ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
 let sumFTailRec fi = let rec loop acc i = if i <= 0L then acc else loop (acc + fi) (i - 1L) loop 0L i 

рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ:
 > sumFTailRec (fun i -> i) 10000000L val it : int64 = 50000005000000L 

рдФрд░ рдпрд╣рд╛рдБ, рдЬреЛ рдЪреМрдХреЛрдВ рдХреЛ рдмреЛрддрд╛ рд╣реИ:
 > sumFTailRec (fun i -> i*i) 10000000L val it : int64 = 1291990006563070912L 

рдЕрднреА рддрдХ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 > let someProblemFun i = i/((i+1L) % 1000L) > sumFTailRec someProblemFun 10000000L System.DivideByZeroException: Attempted to divide by zero. Stopped due to error 

рд╕рдорд╕реНрдпрд╛


I = 999 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рд╡рд┐рднрд╛рдЬрди рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдЧрдгрдирд╛ рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рдорд╕реНрдпрд╛ рддрддреНрд╡ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдорд╛рдзрд╛рди рдЦреБрдж рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ:
 let sumFTailRecWithTry fi = let rec loop acc i = if i <= 0L then acc else try loop (acc + fi) (i - 1L) with exc -> printfn "exn raised:%s" exc.Message loop acc (i - 1L) loop 0L i 

рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
 > sumFTailRecWithTry someProblemFun 10000L exn raised:Attempted to divide by zero. ... exn raised:Attempted to divide by zero. val it : int64 = 351405L 

рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛, рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЕрдм рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
 > sumFTailRecWithTry someProblemFun 10000000L exn raised:Attempted to divide by zero. ... exn raised:Attempted to divide by zero. Process is terminated due to StackOverflowException. 

рдЙрдлрд╝ ... рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ? рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рд╕реНрдЯреИрдХ рдЕрдЪрд╛рдирдХ рдХреНрдпреЛрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛?

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

рдирд┐рд░реНрдгрдп


рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕реА рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рд╣реИ? рдмрд╣реБрдд рд╕рд░рд▓, рдЖрдкрдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ... рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо "рдмрд╛рд╣рд░реА" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 let sumFReallyTailRecWithTry fi = let rec loop acc i = if i <= 0L then acc else let fRes = try fi with exc -> //printfn "exn raised:%s" exc.Message 0L loop (acc + fRes) (i - 1L) loop 0L i 

рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
 > sumFReallyTailRecWithTry someProblemFun 10000000L val it : int64 = 374200932236L 

рджреЗрдЦрд╛! рд╕реНрдЯреИрдХ рдЗрд╕ рдмрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛, рдпрд╛ рдмрд▓реНрдХрд┐, рд╡рд╣ рдЕрдЫреВрддрд╛ рд░рд╣ рдЧрдпрд╛ рдерд╛ред

рддреЛ рдирд┐рдпрдо: рдПрдХ рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдкреВрдВрдЫ рдХреЙрд▓ рдХрднреА рдирд╣реАрдВ ... рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рдеред

рджреВрд╕рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, async {...} рдФрд░ рдореЗрд▓рдмреЙрдХреНрд╕рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЦреБрд▓рд╛рд╕реЗ рд╣реЛрдВрдЧреЗред

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


All Articles