рд╣рд╛рд╕реНрдХреЗрд▓ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдЕрддреНрдпрдВрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рднрд╛рд╖рд╛ рд╣реИред рдЬрд┐рд╕ рдХрд┐рд╕реА рдиреЗ рдХрднреА рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рд╡рд╣ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рд▓рд┐рдЦрдиреЗ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдХрд┐рддрдирд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИред рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдЖрдкрдХреЛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрди рд╕рднреА рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣рдореЗрдВ 3 рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдзрд╛рд░ рд╕реЗ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ: рдорд╛рдирдЪрд┐рддреНрд░, рдлрд╝рд┐рд▓реНрдЯрд░, рдХрдо рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдПрдХ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд╛рджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдордЭ рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧреА, рдФрд░ рдЖрдк рд╕реМрдВрджрд░реНрдп рдФрд░ рд╕реБрдВрджрд░рддрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреИрд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдореВрд▓ рдХрд╛рд░реНрдп
рд╕реВрдЪреА рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
head (x:_) = x head [] = badHead
рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рддрддреНрд╡ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд▓реМрдЯреЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ рдФрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛрд╖реНрдардХ рдХреЗ, рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреА рддрд░рд╣ред
val <T> List<T>.head: T get() = when (this.isEmpty()) { true -> throw NoSuchElementException("List is empty.") false -> this[0] }
рдЖрд╕рд╛рдиреА рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдХреЛ рдкрд╣рд▓реЗ рддрддреНрд╡ + рдЕрдиреНрдп рд╕рднреА рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЖрдЗрдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдпрд╣рд╛рдБ рд╣реИрд╕реЗрд▓ рдкрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
tail (_:xs) = xs tail [] = errorEmptyList "tail"
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдЯрд▓рд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдорд┐рд▓рд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЙрд╕реА рд╢реИрд▓реА рдореЗрдВ рд╡рд░реНрдгрди рдХрд░ рд╕рдХреЗрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
val <T> List<T>.tail: List<T> get() = drop(1)
рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдмреЗрдИрдорд╛рдиреА рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдЕрдм рд╣рдо рд╕реВрдЪреА рдХреЛ рдкрд╣рд▓реЗ рддрддреНрд╡ + рдмрд╛рдХреА рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╕реВрдЪреА рдФрд░ рдПрдХ рддрддреНрд╡ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕реВрдЪреА рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
operator fun <T> List<T>.plus(x: T): List<T> = ArrayList(this).also { it.add(x) }
рдЕрдм рд╣рдо рдЕрдВрдд рдореЗрдВ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлрд┐рд░ рд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
рдРрдб рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
рд╣реИрдВ ред
рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЕрдм рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ
isEmpty () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рд░реБрдХреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:
- isEmpty () - рдХреНрдпрд╛ рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рддрддреНрд╡ рд╣реИрдВ
- рд╕рд┐рд░ - рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡
- рдкреВрдВрдЫ - рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реВрдЪреА
- рд╕реВрдЪреА + рддрддреНрд╡ - рд╣рдо рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдореЗрд░реЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП,
рдЬрдм рдХрдерди рдореЗрдВ рд╕реВрдЪреА рд▓рдВрдмрд╛рдИ рддреБрд▓рдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдХреЛрдЯрд▓рд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЖрдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрдЧрд╛:
val <T> List<T>.size: Int get() = when (this.isEmpty()) { true -> 0 false -> 1 + this.tail.size }
рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрд╡реЗрджрди
рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдФрд░ рд╣рдо рдЪрдХреНрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдХрд░, рдЙрдиреНрд╣реЗрдВ рд╕рдореЗрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рд╣реИрдВ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
fun sum(xs: List<Int>): Int = when (xs.size) { 0 -> 0 else -> xs.head + sum(xs.tail) }
рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпреЛрдЧ 0 рд╣реИ; рдЕрдиреНрдпрдерд╛, рдпрд╣ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рдпреЛрдЧ рд╣реИ рдФрд░ рдкреВрдВрдЫ рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╣реИред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдо рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЧрддрд┐ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рд╕реАрдорд╛ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдП, рддреЛ рдЖрдк рд╡рд╛рдкрд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреБрди: рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рд░рд╛рд╢рд┐ рдХрд╛ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдЙрд╕реА рддрд░рд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдХреЙрд▓
рд░рд╛рд╢рд┐ (xs.tail) рд╣реИ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдб рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
fun sum(xs: List<Int>): Int = when (xs.size) { 0 -> 0 else -> { val head = xs.head val tailSum = sum(xs.tail) head + tailSum } }
рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдкрд╣рд▓реЗ рддрддреНрд╡ рдФрд░ рдкреВрдВрдЫ рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдХрд╛ рдпреЛрдЧ рд╣реИред
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
рдЯреЗрд▓рд░реЗрдХ рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдИрдбреАрдИ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд╛рд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
tailrec fun sum(xs: List<Int>, acum: Int): Int = when (xs.size) { 0 -> acum else -> sum(xs.tail, xs.head + acum) }
рддрддреНрд╡реЛрдВ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ 2 рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ 0. рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореБрдЦреНрдп рдЧрдгрдирд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реБрдП рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪреЗрдВ рдЬреЛ рдЗрд╕реЗ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
fun sum(xs: List<Int>):Int { tailrec fun sumInner(xs: List<Int>, acum: Int): Int = when (xs.size) { 0 -> acum else -> sumInner(xs.tail, xs.head + acum) } return sumInner(xs, 0) }
рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░, рдлрд╝рд┐рд▓реНрдЯрд░, рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛, рдФрд░ рдмрд╛рдХреА, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗред
рдореБрдЦреНрдп рдХрд╛рд░реНрдп
рдПрдордПрдкреА
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЖрдВрджреЛрд▓рди рд╢рд╛рдорд┐рд▓ рд╣реИ, рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рд╕рднреА рдкреНрд░рд╛рдкреНрдд рддрддреНрд╡реЛрдВ рдХреЛ рдирдП рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╕реАрдорд╛ рд╕реНрдерд┐рддрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реИред рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
fun <T, R> List<T>.map(f: (T) -> R): List<R> = when (this.size) { 0 -> listOf() else -> f(head) + tail.map(f) }
рдпрджрд┐ рдореВрд▓ рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛, рд╣рдо рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рддрддреНрд╡ рдФрд░ рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреЗ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡ рдореЗрдВ рджреВрд╕рд░реА рд╕реВрдЪреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
operator fun <T> List<T>.plus(xs: List<T>): List<T> = when (xs.size) { 0 -> ArrayList(this) else -> (this + xs.head) + xs.tail } operator fun <T> T.plus(xs: List<T>): List<T> = listOf(this) + xs
рдлрд╝рд┐рд▓реНрдЯрд░
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕ рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
fun <T> List<T>.filter(f: (T) -> Boolean): List<T> = when (this.size) { 0 -> listOf() else -> if (f(head)) head + tail.filter(f) else tail.filter(f) }
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкреБрди: рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЕрдиреНрдпрдерд╛, рд╣рдо рдХреЗрд╡рд▓ рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдХрдо
рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдФрд░, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдлрд╝рдВрдХреНрд╢рди (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ
рдЧреБрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЛ рдХрд┐рд╕реА рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп
s0 рд╣реИ , рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА
рд╣реИ [] рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди
рдПрдл , рдЬреЛ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рдФрд░ рд╕реВрдЪреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред
f (s0, рдПрдХ [0]) = s1 ред рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХрд▓ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди 0 рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рджреЛ рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
f (s, a [i]) = s + a [i] ред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреБрди: рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
fun <T, R> reduce(s: T, xs: List<R>, f: (T, R) -> T): T = when (xs.size) { 0 -> s else -> reduce(f(s, xs.head), xs.tail, f) }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рдордиреЗ рдКрдкрд░ рд╕рдореАрдХреНрд╖рд╛ рдХреА рд╣реИред рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛, рд╣рдо рдирдП рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдХрд╣рддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрд╢реЛрдзрди рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рд░рдВрдн рдорд╛рди рдХреЛ рдкрд╛рд╕ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрдореА рд╡рд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╣рдо рдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреА рдмрджреМрд▓рдд рд╣рдорд╛рд░реА рдХреНрд╖рдорддрд╛рдПрдВ рдмрд╣реБрдд рдмрдврд╝ рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдореВрд▓ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
fun <T> reduceSame(xs: List<T>) = reduce(listOf<T>(), xs) { ys, s -> ys + s }
рдЕрдм, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдирдХреНрд╢реЗ, рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдХрдо рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕реВрдЪреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕реАрдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред
fun <T, R> List<T>.map2(f: (T) -> R): List<R> = reduce(mutableListOf(), this) { xs, s -> (xs + f(s)).toMutableList() } fun <T> List<T>.filter2(f: (T) -> Boolean): List<T> = reduce(mutableListOf(), this) { ys, s -> if (f(s)) return@reduce (ys + s).toMutableList() else ys }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдЕрдХреНрд╕рд░ рдпрд╣ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЕрдВрдд рд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╝рд░реВрд░, рд╣рдо рд╕рд┐рд░реНрдл рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХрдо рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╕реВрдЪреА рдХреЛ рдЧрд┐рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреИрд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИред
fun <T, R> reduceRight(s: T, xs: List<R>, f: (T, R) -> T): T = when (xs.size) { 0 -> s else -> f(reduceRight(s, xs.tail, f), xs.head) }
рдпрджрд┐ рд╕реВрдЪреА рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реВрдЪреА рдХреА рдкреВрдВрдЫ рдФрд░ рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдкрд╛рд░рд┐рдЬрд╛рдд - реи рд╡рдЧреИрд░рд╣ред рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрди рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдЖрджрд┐ред
рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛, рдЬрдм рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди 3 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдЬрд┐рд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред
рдЖрдЗрдП
рдЬрд╝рд┐рдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬреЛ рд╣рдореЗрдВ 2 рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рд╣рдореЗрдВ 2 рд╕реВрдЪрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВред рдФрд░ рд╣рдо рдЙрди рдЬреЛрдбрд╝реЛрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд▓рдВрдмрд╛рдИ рдореВрд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
fun <T, R> zip(xs: List<T>, ys: List<R>): List<Pair<T, R>> { return when (xs.isEmpty() || ys.isEmpty()) { true -> listOf() false -> Pair(xs.head, ys.head) + zip(xs.tail, ys.tail) } }
рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рджреЛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ
zipWith рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ
fun <T, R, C> zipWith(xs: List<T>, ys: List<R>, f: (T, R) -> C): List<C> = zip(xs, ys).map { f(it.first, it.second) }
рдмрд╣реБрдд рдмрд╛рд░, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╕реВрдЪреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдкреЗрдпрд░ <Int, рдмреВрд▓рд┐рдпрди> рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЕрдЧрд░ рдЭрдВрдбрд╛ == рд╕рдЪ рд╣реИ, рдФрд░ рдЕрдЧрд▓реЗ рдХрджрдо рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЭрдВрдбреЗ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдкрд╛рдардХ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреЛрдЯрд▓рд┐рди рдХреЗ рдкрд╛рд╕ рдЕрдирдВрдд рдЕрдиреБрдХреНрд░рдо рд╣реИрдВ, рдФрд░ рд╡реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВред рдпрджрд┐ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд┐рд╖рдо рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╢реЗрд╖ рд▓реЛрдЧреЛрдВ рдХреЛ рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реВрдЪреА рдФрд░
рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП
рдЬрд╝рд┐рдк рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ [0,1,2 ..]
fun sumWithEvenIndexes(xs: List<Int>) = zip(xs, generateSequence(0) { it + 1 }.take(xs.size).toList()) .filter { it.second % 2 == 0 } .map { it.first } .sum()
рдХреЛрдЯрд▓рд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдЖрдк рдЕрдиреБрдХреНрд░рдо рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдк рдлрд╝рдВрдХреНрд╢рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдкрд╣реЗрд▓реА рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред
рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЖрд╕рдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдкрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рд╢рд╛рд╣реА рдЬрд╛рд╡рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг:
public Integer maxSum(List<Integer> array) { Integer max = array.get(0) + array.get(1); for (int i = 2; i < array.size(); i++) if (array.get(i) + array.get(i-1) > max) max = array.get(i) + array.get(i-1); return max; }
рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдЯрд▓рд┐рди рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдореИрдВ рдЦреБрдж рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ):
fun maxSum(xs: List<Int>) = zipWith(xs, xs.tail, {a, b -> a + b}).max()
рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
maxSum xs = maximum $ zipWith (+) xs (tail xs)
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ (рд╡реИрд╕реЗ, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдм рдХреБрдЫ рдЧреИрд░-рдЖрд╢рд╛рд╡рд╛рджреА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдХреЛрдЯрд▓рд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЙрд╕ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХреЛрдЯрд▓рд┐рди рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕рдВрднрд╡рддрдГ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдпрд╣ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмреЛрдЭрд┐рд▓ рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдФрд░ рдЧрдВрднреАрд░ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ рдирд┐рд░рдВрддрд░ рдЕрднреНрдпрд╛рд╕ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдгред
рдкреБрдирд╢реНрдЪ: рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде
рднрдВрдбрд╛рд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓реЗрдЦ рдореЗрдВ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
PPS: рдЖрдк рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ
рдХрд░рддрд╛ рд╣реИ ред
рдФрд░ рдмрд╛рдж рдореЗрдВ
https://arrow-kt.io/ рдЕрд╡рд╢реНрдп
рджреЗрдЦреЗрдВ ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЖрдкрдХреЛ рддреБрд░рдВрдд рд╡рд╣рд╛рдБ рдирд╣реАрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ, рдЬрдм рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдФрд░ рдореЛрдирдб рдЖрдкрдХреЛ рдбрд░рд╛ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗ, рддреЛ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред