Любовта ми към функционалното програмиране ме доведе до урок по рекурсия. Тема, която много често се прави като мемета, които буквално са достатъчно смешни, за да ме изплашат да не я науча. И разбрах, че това е трева, в която кракът ми още не е стъпвал. И така, един ден изграждам смелостта си върху това и започвам да търся в Google.

Попаднах на много статии в блогове и видеоклипове в YouTube, които се опитват да преподават рекурсия чрез създаване на функция, която прави факториел. Те наистина са добри, това ми помага да науча рекурсията по най-бързия възможен начин за това как една функция може да се самоизвика и да продължи да се повтаря, докато върне желания резултат. Така че, ако мога да ви помогна да си го припомните, кодът ще бъде така (в LiveScript):

Факториалът

Преди да стигнете до тази статия, вероятно сте я виждали някъде, която прави подобен начин за рекурсивно правене на факториел. И ако мога да ви го припомня, функцията „факт“ е рекурсивна функция, която, когато ѝ бъде дадено число като аргумент, тя ще продължи да умножава числото, което сте дали на друга функция „факт“, която дадено текущо число е извадено от 1. ще продължи, докато даденият аргумент върне 1 и вече не прави рекурсия, а вместо това върне само 1.

Може да сте се наситили на този вид факториална рекурсия и търсите малко по-сложна за решаване. Така че превъртях wikipedia, brilliant, khan academy, търсейки математически проблем с рекурсивна природа в него. И намерих метод за изчисляване на Пи, въведен от Грегъри+Лайбниц, който е нещо подобно:

Със сигурност е по-обширен от обичайния начин за изчисляване на pi 22 делено на 7, но предлага по-добра точност на резултата pi, когато се повтори много. Всеки път, когато добавяте повече деление на 4 на нечетно число, точността на резултата ще се увеличи. Може също така да забележите, че за всяка стъпка операторът за събиране и изваждане се превключва и аз не съм достатъчно склонен да се потопя дълбоко в математическата сфера защо е написано така или как може да произведе по-точно число пи. Вероятно ще го оставя на уики страницата на самата „Пи на Лайбниц“.

И така, с настоящото ни разбиране за това как работи рекурсията и как тази конкретна формула изглежда има рекурсивен характер в нея, бях толкова нетърпелив да се опитам да направя рекурсивна функция на pi, че когато ѝ бъде дадено нечетно число, тя ще зацикли, докато спира и връща желания резултат. И сега, ето кода, който измислих:

Пи

Ако трябва да бъда честен тук, отне ми около цял ден, докато стигна до тази функция, само за да ви покажа колко съм нов във функционалното програмиране и въпреки това успях докрай. Така че нека обясня какво прави функцията с нечетен аргумент, даден й.

Когато на функцията pi е дадено нечетно число 15 като len и нищо като true, тя ще върне (4 / 15) + (* -1) pi (15 - 2), null, което означава, че повтарящото се pi в нея ще върне (4 / 13) + (* 1) pi (13 - 2), true и така нататък, тя ще продължи да намалява аргумента len с 2, докато достигне (4 / 3) + (* -1) pi (3-1), което ще върне 4 вместо да го рекурсирате отново. Той е проектиран да спре рекурсията, когато достигне 1 като аргумент len и върне 4 или ще продължи да намалява и да се зацикля за неопределено време.

Така че, когато извикаме функцията pi и дадем 21 като аргумент, тя ще върне резултат от 3,23, което е доста далеч от най-известното число pi (3,14). Но когато го извикаме отново, като дадем 357 като аргумент, той ще върне резултат от 3,14, който сега е много по-близо до очаквания резултат. Докато увеличаваме броя на лещите, който предаваме, той ще се доближава до реалното число pi, въпреки че никога няма да го достигне.

Чрез изграждането на тази pi функция най-накрая събрах смелостта си да прегърна рекурсията при всяка възможност, която имам. Така че, когато видя рекурсивен характер/модел на проблем, ще се опитам да концептуализирам как бих го решил с рекурсия. И мисля, че мога спокойно да кажа,

Когато (можете) да видите рекурсивния характер на проблем, тогава можете да приложите рекурсия, за да го разрешите. Винаги.

След това поглеждам назад към проекта, върху който работя в момента, и няколко други, и се изумявам от това колко проблеми има рекурсивен модел в него, и започвам да правя рекурсивни функции за тях. По този начин на практика извършвам много промени, които елиминират стари функции с някои, които направих. Подходящ пример може да бъде като този:

Истинският проблем

Как, ако искам да превърна всеки намерен низ в него в главни букви и да направя нов обект от него и да запазя неговата структура от данни. Или как, ако искам да получа всеки един низ и да го събера в масив. Или заменете всяка намерена азбука „y“ във всеки низ с „x“. Каквото и да е, ние бихме искали да имаме функция, която, когато ни бъде даден обект или масив с каквато и да е структура, бихме искали функцията да връща желания резултат, това е мястото, където рекурсията идва на помощ.

Проблем, подобен на този по-горе, може да бъде намерен в текущия ми проект mithril-autoform, библиотека, която помага на разработчиците на MithrilJS да създават формуляри и всички негови функционалности просто чрез дефиниране на схема. Може да искате да погледнете и да видите колко много използвам рекурсия, за да накарам библиотеката да работи, и така ще се разглежда като доказателство, че рекурсията може да реши повече от математически проблеми.

Иска ми се тази статия да ви помогне и да бъдете насърчени да научите повече за необятния свят на функционалното програмиране, както и аз.

Рики Пердана, разработчик на Full Stack Meteor, обхванат от MithrilJS и FP в сърцето ми. Нека се опознаем https://github.com/rikyperdana

✉️ Абонирайте се заCodeBurstведнъж седмично Email Blast,🐦 СледвайтеCodeBurstна Twitter, вижте🗺️ Пътната карта за уеб разработчици за 2018 г. и🕸️ Научете за уеб разработка с пълен набор .