Рубрики
Без рубрики

Рекурсия, рекурсия, рекурсия

Рекурсия Михаила Олоруннисола, рекурсия, рекурсионация, прежде чем я скажу вам, какая рекурсия, вы должны прочитать эту статью: рекурсия, рекурсия, рекурсия, прежде чем я скажу вам, что такое рекурсия, вы должны прочитать эту статью: Medium.FreecodeCamp.com Дайте себе погладить Назад, если вы не влюбились в этом.

Автор оригинала: FreeCodeCamp Community Member.

Михаилом Олоруннисола

Прежде чем я скажу вам, что такое рекурсия, вы должны прочитать эту статью:

Рекурсия, рекурсия, рекурсия Прежде чем я скажу вам, что такое рекурсия, вы должны прочитать эту статью: medium.freecodeCamp.com.

Дайте себе погладить на спину, если вы не влюбились в этом. Если бы вы сделали, никаких беспокойств – вы теперь знаете, что такое рекурсия!

Когда я впервые начал кодировать, я подумал о рекурсии все время. Раньше я думал об этом как о некоторых волшебных заклинании, или некоторые более высокой техники, что только лучшие из лучших разработчиков, используемых для решения самых сложных проблем.

Как оказывается, вообще не волшебство. Но хорошие разработчики понимают это. И отличные разработчики понимают, когда лучше его пользоваться.

Так что же именно рекурсия?

Вы когда-нибудь практиковали что-то снова и снова до тех пор, пока вы “поймали это? ” Затем вы предварительно освободили рекурсивный акт.

Явно говоря, вы выполнили задачу или серию шагов несколько раз, пока вы не достигнете желаемой цели. Это, мои друзья, это сущность рекурсии.

В Code говорят, рекурсивная функция – это функция, которая называет себя.

Прежде чем мы прыгаем в любой код, давайте пройдемся по основным примерам, чтобы понять структуру рекурсивных функций. Поскольку фортепиано находится недалеко и дорогой для моего сердца, мы сделаем функцию под названием PartyPiano.

Каждый раз, когда эта функция называется с человеком, этот человек будет практиковать фортепиано. Так как я не трачу достаточно времени, практикующих прямо сейчас, я должен немного практиковать.

practicePiano(person){  practiceScales(person);    practiceChords(person);}
practicePiano('Michael');

Я назвал функцию выше один раз, поэтому я смог получить одну сессию, но мне определенно нужно больше, чем нужно лучше.

practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');practicePiano('Michael');...

Это здорово и все, но это разбивает один из величайших принципов программирования: не повторяйте себя (сухой).

Я смог получить больше тренировочных сессий, но каждый раз, когда я хочу больше практиковаться, я должен добавить еще один звонок для практики фортепиано.

Один из способов решить эту проблему, вызывая функцию внутри себя, так что каждый раз, когда я практикуюПиано, я практикую больше:

practicePiano(person){  practiceScales(person);    practiceChords(person);
//Recursive magic here!
  practicePiano(person);}
//Now we only need one of these!
practicePiano('Michael');

Это круто! Мне нужно только назвать это один раз. Единственная проблема в том, что однажды я назову эту функцию … Я никогда не перестаю практиковать. Я никогда не останавливаюсь, пока не будет буквально невозможно, чтобы я больше практиковались.

//Our code above would behave as follows:
  practiceScales('Michael');    practiceChords('Michael');
//Recursive Call
  practiceScales('Michael');    practiceChords('Michael');
//Recursive Call
  practiceScales('Michael');    practiceChords('Michael');
//Recursive Call
//..till I can't physically practice anymore

Когда ваш компьютер достигает аналогичного точка, где он не может продолжать, это обычно возвращает эту ошибку:

RangeError: Maximum call stack size exceeded

Это эквивалент вашего компьютера, говоря: «У меня закончился пространство и пришлось закрыть магазин. «Он записал каждую функцию вызова в памяти в стеке. Но поскольку звонки никогда не останавливаются, стек полностью заполнен, а компьютер вынужден остановиться. (Это то, откуда имя для популярного сайта, от переполнения стека.)

Так что возвращаясь к моему никогда не заканчиваю работу пианино, как мы можем держать руки от падения?

Здесь мы видим важность термина, который вы, возможно, слышали раньше: Базовый чехол Отказ

В рекурсивных функциях базовый случай – цель, которую вы пытаетесь достичь, или задача, которую вы хотите завершить. Работа базового случая заключается в том, чтобы сообщить вашу функцию, когда она должна остановиться.

В нашей аналогии эта цель можно практиковать, пока не устану.

practicePiano(person){   if (tired(person)){ //When I am finally tired    console.log("Guess you can take a break now...");    return ;  //This will return out of the function and stop the recursive call  }
  practiceScales(person);    practiceChords(person);
//Recursive magic here!
  practicePiano(person);}
//Now when we call this here...I'll only practice over and over again until I'm tired
practicePiano('Michael');

Вот где большинство разработчиков столкнутся с проблемами. Хотя наша текущая аналогия практики пианино является упрощением, она приводит домой чрезвычайно важный момент: что, если я никогда не устал от практики? Тогда базовый случай, который мы пишете, не решит наш «максимальный размер стека вызовов превышен».

Прежде чем мы прыгаем прямо в кодировку, важно потратить время, чтобы отразить все возможные ситуации, которые могут – и должны останавливать наши рекурсивные звонки.

Как разработчик, вы напишите сложные алгоритмы, которые могут принимать переменные входы и использовать рекурсию для достижения какой-либо цели.

Вы можете разработать базовый случай или несколько базовых случаев, которые вы считаете, будут достигнуты вашим рекурсивным вызовом. Но это не всегда может быть так.

Рассмотрим случай моего киборга коллега:

practicePiano(person){   if (tired(person)){    console.log("Guess you can take a break now...");    return ;    }
 if (handsFallOff(person)){   console.log("Go see a doctor about that");    return ; }
  practiceScales(person);    practiceChords(person);
  practicePiano(person);}
practicePiano('Cyborg-Michael'); 
//Cyborg-Michael never gets tired//Nor do his hands ever fall off//Back to being stuck practicing forever...

Учитывая это, важно всегда следить за тем, чтобы вы были тщательно разработать вашу базовую корпус (ы), и некоторые функции ведут себя таким образом, что базовый случай всегда будет достигнут.

В нашем примере логический базовый случай сможет сыграть в целом, как 5-й Бетховен.

Рефакторинг нашего кода, у нас сейчас есть:

practicePiano(person, song){   if (tired(person)){    console.log("Guess you can take a break now...");    return ;    }
 if (handsFallOff(person)){   console.log("Go see a doctor about that");    return ; }
 if (song(person)){   console.log("Great Job! Time to learn this on the guitar!");    return ; }
  practiceScales(person);    practiceChords(person);
  practicePiano(person, song);}
practicePiano('Cyborg Michael', BeethovenFifth); 
//The Cyborg version of me never gets tired//Nor do my hands ever fall off//But, being a cyborg...I can learn Beethoven's 5th pretty quickly

Это сила рекурсивных решений. С несколькими строками кода я могу добиться некоторой задачи, для которой я могу не знать, сколько шагов может занять. Мне может понадобиться 100 тренировочной сессии, тогда как моя киборга будет нуждаться только на 5, но это решение все равно будет работать для нас обоих.

Итак, чтобы повторить, просто помните следующее:

  1. Рекурсия позволяет легко повторять задачу для достижения какой-то цели.
  2. Базовый случай (ы) должен быть достаточно тщательно, чтобы позволить вашей рекурсивной функции на самом деле достичь вывода (и не запускаться навсегда).
  3. Рекурсия помогает вам сохранить свой код сухим (опять же, вы многое услышите это аббревиатуру, поэтому помните, что он стоит «Не повторять себя» –oops, я только что сделал!)

Больше рекурсии прийти

Мы пойдем более глубоко в рекурсии в моей предстоящей серии на структурах данных. Во время этого глубокого погружения мы посмотрим, как вы можете начать использовать анализ сложности времени и рекурсия в вашем повседневном коде. Мы также будем работать через различные петлиные методы, чтобы понять, почему может быть лучше использовать один над другим.

Кроме того, одна из тем у нас не было возможности покрыть здесь факториал проблемы. Факториальные проблемы – это то, где вы находите рекурсивные решения, применяемые чаще всего, поскольку они требуют рекурсивно, итерации определенного количества раз. Вы можете найти более специфики, касающиеся решения факториальных проблем в этом Удивительная статья по сайту.

Вот несколько дополнительных ресурсов, чтобы помочь:

Хан Академия на рекурсию Узнайте бесплатно о математике, искусстве, компьютерном программировании, экономике, физике, химии, биологии, медицине, финансах … www.khanacademy.org Sparknotes: Что такое рекурсия?: Что такое рекурсия? Краткое изложение того, что такое рекурсия? В чем рекурсия? Изучите именно то, что произошло в этой главе, сцене или … www.sparknotes.com MyBreainishuge/рекурсионные-подсказки Рекурсионные-подсказки – репозиторий предложений, которые будут решены с использованием рекурсии github.com

Также, благодаря Яра Терсеро Для того, чтобы помочь редактировать это.

Оригинал: “https://www.freecodecamp.org/news/recursion-recursion-recursion-4db8890a674d/”