Page 227 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 227

Важно, что у рекурсивной функции обязательно должно быть условие остановки
       (stopping condition ;   без него она продолжит вызывать саму себя до тех пор, пока
                        )
       интерпретатор JavaScript не решит, что стек вызовов стал слишком большим (что
       приведет к аварийному завершению программы). В нашей функции findNeedle есть
       два условия выхода: когда иголка найдена и когда стог закончился. Поскольку мы
       уменьшаем размер стога каждый раз, в конечном счете мы неизбежно достигнем од­
       ного из этих условий остановки.
          Давайте  рассмотрим  более  полезный,  проверенный  временем  пример:  поиск
       факториала числа. Факториал числа - это число, умноженное на все числа до него
       и обозначаемое восклицательным знаком после числа. Таким образом 4! вычисляется
       как 4  х  3  х  2  х  1  =  24. Вот как мы реализовали бы это в виде рекурсивной функции.
       function  fact ( n )    {
           i f ( n   ===  1 )   return  1 ;
           return  n  *  fact (n-1 )  ;


          Здесь есть условие остановки (n  ===  1), и каждый раз, делая рекурсивный вызов,
       мы уменьшаем значение n на единицу. Так мы в конечном счете доберемся до  1  (эта
       функция не будет правильно работать, если вы передадите ей О  или отрицательное
       число, хотя, конечно, мы могли бы добавить ряд проверок, чтобы этого не случилось).

       За к  люч е н и е


          Если у вас есть опыт работы с другими функциональными языками програм­
       мирования, такими как ML, Haskell, Clojure или F#, эта глава вряд ли была для вас
       сложной. В противном случае она, вероятно, расширила ваш круrозор, и вы узнали
       немного больше об абстрактных возможностях функционального программирова­
       ния (поверьте, впервые столкнувшись с этими идеями, я был, конечно, удивлен). Вы
       могли бы быть поражены количеством способов, которыми можно достичь той же
       цели, и задаться вопросом "Какой путь лучше?" Боюсь, что простого ответа на этот
       вопрос нет. Зачастую он зависит от решаемой задачи: некоторые из них имеют толь­
       ко определенную методику. Многое зависит и от вас: какие методики вам нравятся?
       Если представленные в этой главе методики ставят вас в  тупик,  то я рекомендую
       перечитать  ее несколько  раз.  Изложенные здесь концепции чрезвычайно мощны,
       и единственный способ уяснить, какие из них будут полезны именно для вас, - это
       внимательно изучить их и понять.











       230      Глава  1 З. Функции и мощь абстрактного мышления
   222   223   224   225   226   227   228   229   230   231   232