Сказка "Репка". Крайний случай. Прямой и обратный ход рекурсии. Алгоритм изготовления матрёшки. Программа, печатающая матрёшку. Курс молодого бойца по информатике (Язык Си). cs.mipt.ru/c_intro
Должен признаться очень интересный и оригинальный подход к подаче материала. Совмещение 2D элементов на доске с 3D объектами на столе создают какое то неописуемое погружение в процесс и заставляют, как то по особенному воспринимать информацию. Спасибо, было очень интересно.
Хорошо (просто, образно и понятно) объяснил рекурсию! В институте, в конце 80-х, пару лет ловил этот образ, а тут всё так чётко и понятно! Молодец! Спасибо!
Как человек, который лучше воспринимает информацию визуально и у которого проблемы с пониманием рекурсии (были до просмотра видео) безумно благодарна вам, что разложили этого зверя на матрешки 😁 Было не только полезно, но и безумно интересно, не оторваться от просмотра)
@@ЕвгенийВовк-ы7ь Я имел в виду что: У нас есть программа, и у неё есть ресурс в виде "Деда", который может тянуть 50 ньютнов. Так почему бы не сделать программу так, чтобы она сперва посмотрела на то, сколько ей ещё нужно дотянуть и такая "Ага, мне нужно ещё вытянуть 50 ньютонов и у меня есть как раз дедов на всю дозволенную RAM которые будут тянуть по 50 ньютонов... Пожалуй вызову я одного!" вместо того, чтобы вызывать бабку, дочку, собачку, кошку, МЫШКУ. (или пример таким, чтобы нужно было вытягивать не 100 ньтонов, а 120 например. Чтобы имела место рекурсия) Я сейчас пишу как человек, который уже всё бросил (Да простят меня Центральный Процессор Всевышний да Святая Щперационная Система). Так что, прошу no offens.
Спасибо! Потрясающе интересное объяснение! И, конечно, отдельно отмечу, как круто вы рисуете мелом на камеру и выставляете фигурки - действительно, мастер спецэффектов. Подскажите, кого можно посмотреть, кто так же круто объясняет рекурсию и всё остальное, но в связке с JS?
))) Нет вещи столь малой, в которую не вместилась бы ещё меньшая. Нет столь великой вещи, которую не превзошла бы величиною ещё большая. (с) Козьма Прутков
Тимофей, браво, отлично умеете ярко и просто показать рекурсию! Спасибо за ваш труд! # программа на Python, демонстрация матрешек def nesting_doll(num): if num == 1: print ('Цельная матрешка (дно рекурсии)') else: print ('Верхняя часть '+str(num)+' матрешки (прямой ход)') nesting_doll(num - 1) print ('Нижняя часть '+str(num)+' матрешки (обратный ход)') nesting_doll(5) #вызов функции на Питоне """ загрузив ее сюда, можете наслаждаться визуализацией поэтапного ее выполнения www.pythontutor.com/visualize.html """
Здравия! Круто! Так просто объяснить такую сложную тему это талант. Особенно порадовало привлечение народного фольклора. Молодёжи напомнить про корни. Несколько слух резануло слово "безделушки". На самом деле очень глубокий смысл есть в матрёшке. Означает семь наших тел. Непосредственно физическое, самое маленькое, и далее тела духовные. Тонкие материи. Нашим предкам это было известно. Оттуда же и слово "семья" произошло. Сказка "репка" тоже имеет очень глубокий смысл)
Рекурсия, пусть на неё фалломорфируют многие всё же плохое решение, особенно в C/C++. Причина во-первых в производительности, т.к. множественные переходы могут в результате оказаться дороже самих вычислений, заканчивая уязвимостью в переполнении стека, особенно это касается ситуаций, когда в перспективе будут использоваться разные устройства, причём эти ошибки сложно или даже невозможно отследить в будущем! В F#, как и в некоторых других функциональных языках компилятор распутывает рекурсию и "за кадром" преобразует её в цикл, C этого НЕ делает по понятным причинам. Рекурсия полезна для теории, т.к. бывает очень выразительная, но для результирующего кода совершенно необходимо преобразовать её в цикл, циклы кстати оптимизируются в gcc в отличие от рекурсий. Особый котёл ждёт тех, кто использует рекурсию в интерпретируемых языках, она и так тормознутая, а с ними может вообще повесить всё намертво (что в итоге часто и случается).
Обычно приводят пример с оружейным магазином (ну, куда патроны всовывают) и патронами. Магазин - это стек. Патроны - это функции. Номера на патронах - это аргументы, т.е. передаваемые функции значения. Представьте, что у вас пистолет и n патронов. Пусть в данном случае n = 7. Вы пронумеровали этот патрон как 7 и поместили его в магазин. Здесь и дальше по тексту поместить патрон = вызвать функцию. А выстрелить = вернуть результат. Следующий патрон у вас будет с номером n - 1, т.е. в данном случае это номер 6. Его вы помещаете в магазин поверх того патрона с номером 7. След. патрон будет n - 1, где n уже равно 6, т.к. предыдущая функция хранит своё значение n, а не первоначальное. Т.е. получается, что третий патрон, который вы поместите в магазин, будет с номером n - 1, т.е. 6 - 1 = 5. И так далее, пока не выполнится заданное условие (оно может быть что-то типа if (n == 1) {Console.WriteLine($"Патрон номер {n}"); return;} Это пример на синтаксисе языка C#. Т.е. вы будете помещать патроны в магазин до тех пор, пока последним патроном не станет тот, который вы пронумеруете единицей. На данный момент картина получается такая: магазин заряжен семью патронами, где патрон с номером 7 находится в самом низу магазина, т.к. его туда поместили самым первым. А самым верхним патроном является патрон с номером 1, потому что он был помещён в магазин самым последним. Заметьте, что всё это время вы только помещали патроны, но не выстреливали. Т.е. функция пока что только вызывала сама себя, но ни разу не возвращала результата. А теперь, когда выполнилось заданное в if условие, вы начинаете выстреливать, т.е. возвращать результат. Когда совершится первый выстрел, патрон с каким номером вылетит? Правильно, с номером один. Т.е. этот патрон был помещён самым последним, а выстрелен самым первым. Так и в вашей программе первым вернётся результат той функции, которая была вызвана последней. Эта функция, которая была вызвана последней, первая возвращает свой результат той функции, которая была вызвана перед ней. Потом следующий выстрел. Вылетает патрон с номером 2. А патрон с номером 2 - это функция, которая была вызвана предпоследней и которой перед этим передался результат выполнения последней вызванной функции (т.е. той, которая вернула патрон с номером 1). И так до конца. Последним выстреленным патроном будет патрон с номером 7. Помещали вы его первым, а выстрелили последним (т.е. функция с этим значением вызывалась первой, а её результат вернулся последним). Этот результат уже вернётся туда, откуда первоначально вызывали данную функцию.
@@753bc9 Допустим. Но если нам нужен факториал n числа? То как происходит разворот рекурсии при возврате 1 и как потом идет умножение чисел по порядку по возрастающей? В какой момент происходит этот разворот и как функция понимает что ей нужно умножиться и тд? Вот именно этот момент всем непонятен. Лично я ищу его уже неделю(
Также и на производстве выполнение задания: 1.начальник 10000$, 2.зам 7000$, . . . n.мастер 800$, n+1.работяга 400$. Сам был удивлён когда такое объяснение "зашло" 16-ти летним с первого раза.
Объясните кто понимает: почему после того как n стала равна 1, снова вывелось на печать 1, 2, 3... 7. Я понимаю что данные возможно были в стэке, но кто вызвал стэк? И как например сделать рекурсию чтобы не было этого вывода обратно к 7. Если бы это были переменные от задачи, выходит так что задача бы решилась, а потом снова разРешилась)))