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 З. Функции и мощь абстрактного мышления

