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
   221   222   223   224   225   226   227   228   229   230   231