Page 226 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 226
const sumOfSquares = newSummer ( x => х*х) ;
const sumOfCubes = newSummer ( x => Math . p ow ( x , 3 ) ) ;
sumOfSquares ( [ 1 , 2 , 3 ] ) ; / / возвращает 1 4
sumOfCubes ( [ l , 2 , 3 ] ) ; / / возвращает 3 6
Эта методика, когда ы берем функцию с несколькими аргументами
м
и преобразуем ее в функцию с одним аргументом, называется каррин
гом (currying) в честь ее разработчика, американского математика Ха
(
скелла Брукса Карри H askell Curry).
Случаи возвращения функции из функции зачастую глубоки и сложны. Если вы
хотите увидеть больше примеров этого, взгляните на пакеты приложения среднего
уровня для Express или Коа (популярные среды веб-разработки JavaScript).
Ре к урсия
Другой весьма распространенный и важный способ использования функций -
это рекурсия (recursion), когда функция вызывает саму себя. Это особенно мощная
методика, когда функция делает то же самое с постепенно уменьшающимися набо
рами данных.
Давайте начнем с вымышленного примера: поиска иголки в стоге сена. Если бы
у вас были реальный стог сена и игла, которую нужно найти в нем, то реальный под
ход мог бы быть таким.
1. Если вы можете увидеть иглу в стоге сена, перейти к п. 3.
2. У д алите часть сена из стога. Перейти к п. 1 .
3 . Г о тово!
Вы просто каждый раз уменьшаете размер стога сена, пока не находите иглу; это
и есть рекурсия. Давайте посмотрим, как преобразовать этот пример в код.
function findNeedle ( h aystack) {
т
c
if ( h aysta k . l ength === 0 ) return " З десь иголки не ! " ;
if ( h aystack . shift ( ) === ' и голка ' ) return " Н ашли ! "
return findNeedle ( h aystac ) ; / / стог сена уменьшился на один элемент
k
о
о
о
о
о
[
findNeedle ( ' с ен ' , ' с ен ' , ' с ен ' , ' с ен ' , ' и голка ' , ' с ен ' , ' с ен ' ] ) ;
о
В этой рекурсивной функции важно обратить внимание на то, что она учитывает все
возможности: если массив haystack пуст (когда негде и ничего искать), когда иголка -
первый элемент в массиве (готово!) или не первый (она находится где-то в остальной
части массива, поэтому мы удаляем первый элемент и повторяем функцию; помните, что
Array . prototype . shift удаляет первый элемент из массива по месту).
Рекурсия 229

