Рекурсия и стек в JavaScript на примерах: factorial, fibonacci, flatten
Вставка
- Опубліковано 2 тра 2024
- Подробно рассмотрим работу рекурсии в JavaScript на примерах factorial, fibonacci и flatten. Расскажу про достоинства, недостатки и сложность рекурсивных функций.
🍀 Поддержать канал: www.donationalerts.com/r/webe...
☕️ Купить кофе: buy.stripe.com/5kA7sL9574SG7x...
🎨 Купить набор кистей Procreate: webelart.com/illustration.
✍️ Мой telegram channel: t.me/webelart
🏰 Английский UA-cam: @webelart_en
💁🏼♀️ Инстаграм: / webelart
🦄 LinkedIn: / webelart
Рекомендую посмотреть:
1. Стек и очередь в JavaScript • Учимся использовать ст...
2. Оценка сложности алгоритмов в JavaScript • Оценка сложности алгор...
00:00 введение.
00:50 factorial(n)
10:43 fibonacci(n).
16:15 достоинства и недостатки.
19:18 flatten(...)
На канале я рассматриваю различные темы веб-разработки, на текущий момент: веб-основы, веб-анимации, веб-дизайн.
17:48 в 20ой строке там разве не n * factorial(n-1)?
Да, всё верно, опечатка. Закрепила ваш комментарий. ❤️
Готовлюсь к собесу, повторяю теорию. Спасибо за видео!
Thanks for подробный анализ для чайников!! Именно такие "разжеванные" ролики нужны!!!
Наконец я нашел место, где объясняют все эту сложную математимщину - простым языком! Лена, спасибо!
❤️😘
Спасибо вам огромное, очень полезное видео)
Блин, так просто и доходчиво еще никто не объяснял рекурсии ))) Елена спасибо за годный контент
Спасибо за ролик и за вашу работу! Очень понятно!
Самое комфортное объяснение. Спасибо !!!
Спасибо добрый человек) до меня наконец то дошло))))
🔥🔥🔥
Прекрасно! Где то 8-9 видео где обещают обьяснить на пальцах но стало еще больше непонятно! Само собой все замораживается а потом друг на друга умножается без какой либо логики, просто само собой. Огонь прям!
всё стало понятнее а то сидел мучался
не останавливайте свою деятельность, Елена. спасибо!
Спасибо вам большое, наконец-то я понял тему. Целый день не мог понять логики, а тут ваше видео, как будто ангел с небес спустился
спасибо вам огромнейшее, наконец то теперь все стало понятно
спасибо за урок
Спасибо за качественный контент! В вашем уроке гораздо больше информации, нежели на других каналах. Как правило, у всех дальше реализаций рекурсии в факториале и Фибоначчи не заходило, поэтому очень интересно было посмотреть реализацию рекурсии во flatten. Подписался на вас, буду изучать)
очень понятно и четко объяснили спасибо большое вам
Отличная подача, доступное объяснение и никакого нервяка. Спасибо!
❤️
Спасибо, у тебя крутые уроки!
спасибо!)
Супер, очень подробно, все непонятные моменты стали понятными !!! Тысячу спасибо !!!
❤️❤️❤️ Я рада!
Огромное спасибо за видео! только с ним смог понять как считается факториал все-таки
❤️❤️❤️
Ещё не досмотрела до конца, но уже поставила лайк❤️ У вас потрясающий контент, так хорошо объясняете, мне бы таких преподавателей, не всем дано так идеально объяснять, раскладывать всё чётко по полочкам✨ Иногда мне кажется, что это я не понимаю, но когда нахожу на вашем канале тему, которая нужна, пересматриваю и бинго всё понятно🤩 Прям радуюсь в этот момент. Спасибо Вам большое за старания, продолжайте в том же духе💘
Елизавета, спасибо большое за такой приятный и тёплый комментарий! 😌❤️
Красава!!!просто умничка!!!спасибо , мил человек...
Спасибо Елена! Очень просто и понятно. Лайк подписка репост ))
Огромное спасибо, мне как раз нужно было понять как ведет себя call stack, благодаря наглядному примеру понял наконец таки !💚💚
Спасибо большое! Очень интересно, подробно, познавательно! Вы вдохновляете! Пожалуйста, продолжайте. Очень хочу пересмотреть все Ваши учебные видео и продолжать смотреть в будущем. Удачи Вам во всём!
Спасибо Вам большое! ❤
Елена , спасибо
❤
Круто разрезолвлено и расказанно!
Кстати, Если мы знаем, что в flatten массиве будут ТОЛЬКО числа или строки, которые можно привести к числу (5, '5' etc), то решить можно за 1 строчку кода
arr.flat(Infinity).map(Number)
thx!
The video is very interesting. But where can this technology be used in practice? Could you give some (preferably simple) examples of recursion in practice?
супер видео, спасибо!
❤️🤗
с удовольствием учусь по Вашим видео, подача информации, материал просто супер! спасибо Вам!!!!
супер!!!!
Спасибо
Спасибо❤️❤️❤️
😘❤❤
thank you very much
ты такая классная, очень рад, что нашел твой канал!
😂Спасибо! Рада, что материал нравится!!
Музыка на фоне очень громкая, а так контент хороший. Лайк)
Добрый день. Интересно как можно реализовать полифил метода Flat. Я имею ввиду сделать свой метод. Через Array.prototype.
👏
отличное объяснение про РЕКУРСИЮ, получше чем другие, вы объясняете что происходит, а они тупо показывают пример не разбирая процесс
Добрый день! вообще не понимаю ни чего, если последовательность фибаначчи выглядит так: 0, 1, 1, 2, 3, 5, 8, 13... Вы запрашиваете 6 число, оно выводит 8 хотя 6 число как видно 5. Так каким методом тогда при запросе вывода 5 числа из полседовательности получить вывод на экран 3? по вашей формуле 5 выводит 5. классический метод я уже пробовал ))
СПасибо
Yo, это рили круто
если факториал меньше 0 то есть минусовое число то не выгодно ли проверить его умножить на -1))
Елена, здравствуйте, сложновато дается понимание строки 58 в функции flatten, а именно: result.push(...flatten(...currentEl)); можно ли как-то заменить эту строку, чтобы было попроще и понятнее, сложновато немного)
Продолжай курить flatten, я в тебя верю мужик! ❤🔥❤🔥❤🔥
разве в flatten(...correntEl),не рест оператор используется ?Мы же вроде как собираем элементы в массив 23:04
рест, просто автор видео попутала , скорее всего.
"Как мы помним со школы" нифига не помним 🤣
что за трэк на фоне?
Елена, почему в последнем примере тернарный оператор мы обернули в круглые скобки, а не в фигурные? (Array.isArray(item) ? acc.concat(flatten(...item)) : acc.concat(item))
Хороший вопрос. Смотрите, в data.reduce мы кладём функцию, функцию в JS можно создать двумя основными способами:
1. Стрелочная функция () => {...}
2. Использование слова function: function fName() {...}
Плюс там всякие вариации с именованиями, анонимные и т.д. Но основное стрелочная либо использование слова function. Основное отличие в function мы можем использовать внутренний this. В стрелочной this всегда берётся извне.
В текущем примере мы использовали стрелочную функцию. И у неё есть особенности. Мы можем передать фигурные скобки {}, но тогда внутри нам нужно что-то будет вернуть из функции return. Т.е. в примере можно было вызывать с фигурными {return Array.isArray(item) ?....}, но не забыть return.
Либо можно использовать круглые скобки, если у нас сразу идёт возврат, нет никаких доп. переменных, рачётов. Т.е. по факту (acc, item) => (Array.isArray(item) ? ...) эквивалентна (acc, item) => {return Array.isArray(item) ? ...}
Надеюсь стало понятнее. По функциям рекомендую почитать. learn.javascript.ru/function-expressions и вот эта статья по стрелочным функциям learn.javascript.ru/arrow-functions-basics
Елена, большое спасибо! Не догадался, что это так работает. Теперь буду знать.
Видео - просто супер! Только вопрос: если в console.log(flatten()); не переменные, а массив? Как измениться код?
Пусть это будет вашим домашним заданием. Разобраться как поменяется код.❤
background music is very cool :)
❤️
Было бы не плохо пример преобразования linkedList в array через рекурсию (пример list = { value: 1, next: { value: 2, next: null})
Преобразования во что? Обход списка?
У меня есть про деревья: ua-cam.com/video/loLjdVaaDKs/v-deo.html и обход дерева в том числе.
22:10 почему result.push(...) зачем спредить функцию, хотя проверил у себя - работает
P.S. Почему внутри, во flatten кидаем спред - я понимаю
Елена, некоторые понятия объяснены не правильно, так длина стека не определяется количеством вызовов, в данном случае ограничением является объём выделенной под стек памяти. Таким образом функции, принимающие большее количество параметров, достигнут предела по стеку раньше чем функции с меньшим количеством параметров. Когда выполняется тело функции, то все параметры использованные при её вызове уже хранятся в стеке. Это не происходит в момент вызова подфункции.
Дякую за крутезний матеріал, багато чого почерпнув для себе
Вроде все рассказали и про глубину и про О, но как просиходят сами вычисления в фибоначчи так и не понял
Расскажите подробнее. Формула не понятна? Или, может, как код работает?
@@webelart логика вычислений и что вообще считаем ) Я так понял вы считаете сумму чисел в последовательности Фибоначчи до числа n ? Тогда не понял именно 2 рекурсивных вызова n - 1 и n - 2 . Я понимаю что я где то в логике ошибаюсь и не до конца понимаю. Например нам нужно сложить все числа Фибоначчи до 6, это будет 0+1+1+2+3+5 =12.
А вот как здесь n-1 + n-2 работают я не понял n-1 = 5
n-2=4.
Ну и эм... Все мои мысли зашли в тупик .
Я не понял почему мы каждое значение берём от 0 до n, когда например 4 в эту последовательность не входит .
В общем где то я что то упустил , но не понимаю что(((
@@webelart факториал в целом сразу понял
@@fedc_ Я чуть попозже отвечу. Поняла проблему.
@@fedc_
Нет в функции Фибоначчи считается не сумма до числа n.
Смотрите, последовательность Фибоначчи представляет собой набор цифр: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, Т.е. это по факту бесконечная последовательность. Каждая следующая цифра является суммой двух предыдущих.
В функции fibonacci(n) находится значение, которое присуще n-ой позиции. Например, fibonacci(7) = 13, fibonacci(6) = 8, т.е. n - это как бы индекс в последовательности Фибоначчи: 0,1,2,3,4,5,6,7 и т.д.
И собственно чтобы получить число более глубокое чем 1 нужно взять два предыдущих числа n - 1 и n - 2 и сложить их.
Есть прояснения?
если можно без музыки
Рекурсия простыми словами. Начнём с факторами 😂😂😂😂😂
😂 я полагаю все знают что такое факториал, мне кажется последовательность Фибоначчи круче.
@@webelart Последовательность Фибоначчи - число равно сумме двух предыдущих. Коротко и ясно . В эту игру можно играть вдвоём . То - есть может быть и 0, -1, -1, -2 и так далее .
Пытаюсь во фронт, рекурсия - моя боль.
Почему это вообще циклится?
Про рекурсию? Смотри допустим ты компилятор и вызываешь код, ты вызываешь функцию и выполняешь её. А внутри вновь её вызываешь, т.е. опять заходишь в функцию и выполняешь ещё и в ней ещё раз вызываешь, так можно зациклиться до бесконечности, если не сделать остановку. Если попробовать из примера в жизни, даже не знаю что такого придумать, допустим ты входишь в комнату и в этой комнате есть дверь, в которая ведёт в туже самую комнату. В реальности такого не встретишь, здесь надо просто представить. Можно сравнить вход в комнату с вызовом функции одной и той же. Но чтобы это не повторялось бесконечно, устанавливаются условия и в комнату ты входишь с новым набором переменных.
Кстати в жизни такие зацикливания я ещё сравнивала с отражениями зеркал, когда с спереди и сзади есть зеркало и ты начинаешь повторяться бесконечное число раз.
@@webelart спасибо что ответили. Все равно это очень сложно, запутанно. Очень сложно собрать «конструкцию» в голове.
@@webelart не знаю кем вы работаете, наверное программистом. Часто приходится пользоваться рекурсиями ?
А так, у вас лучшее объяснение рекурсии
@@antoncigur2724 Да, рекурсию не так просто переварить. Здесь если разбираться рекомендую изучить дать себе время и порешать задачки, например на www.codewars.com. Дать мозгу осознать и привыкнуть.
Да, я программист, по факту веб-разработчик. :) Спасибо, я рада, что контент зашёл!
@@webelart в веб много пользуетесь рекурсией?
Случайно сюда зашел и как по мне, автор видео очень плохо объясняет, особенно в конце с flatten. Когда автор видео что-то объясняет - вспоминаю универ, где все также на словах в уши заливал препод, а на деле ничего непонятно, только если самому код разбирать и вникать. Просто какой-то сумбур из уст, несмотря на то, что в коде все более менее ок. Поток мыслей бежит, ну учить объяснять совсем у девушки не выходит. 23:06 - используется фраза "используется spread оператор, чтобы собрать массивчик?" Spread оператор расскладывает массив на элементы, а не собирает, а функция уже возвращает массив result. Оператор spread не используется для того, чтобы собрать массивчик, это не правильная интерпретация автора. В функцию мы передает с помощью оператора ...rest все элементы в виде массива (он же ...data).
А вы я вижу являетесь дискриминатором, вас так штормануло, что девушка преподаёт крутой контент?
Объяснение отличное, если у вас там что-то чешется в штанах, возьмите и почешите. А сюда люди приходят учиться и усваивать информацию, если что-то не понятно - вопрос. Обесценивание контента - это самое низкое, что обычно делают люди с весьма низкой самооценкой пытался выстроить себя за счет других. Не на этом канале мен.👁
И да, будете писать всякую херню заблочу! И учтите я одна из немногих на ютубе, кто помогает и отвечает на вопросы своих подписчиков. 😘
@@webelart я не пытался обидеть, это просто мое мнение, никого я не пытался там выстроить и т.д.. Мне просто не очень понравилось как преподнесен был материал. Да, я провел аналогию со схожим преподаванием в универах: где много слов, а толку мало. В принципе, вам, как автору обучающего контента, вполне по барабану кому и что там не понравилось, но как по мне - повод задуматься о качестве преподавания, чтобы его улучшать и не терять подписчиков, т.к. если бы мне объяснение материала показалось более качественным/понятным, то я бы подписался. Мне, честно, не особо-то интересно, заблочите вы меня или нет, т.к. я , повторюсь, случайно сюда зашел , а список своих каналов по разработке держу в подписке. Желаю удачи в этом нелегком деле и желаю только расти в этом.
@@RuslanNumber1 Это вообще как не обидеть обозвав мой контент, вы с людьми также на улице разговариваете при знакомстве? Мне не очень нравится как вы выглядите уж простите.
Вы же понимаете, что каждый человек уникальный, как целая вселенная. Каждый преподносит свой материал по своему. И вы я уверена, если будете делать рассказ, найдется куча людей которым не понравится.
Дополнить материал - это нормально, я всегда слушаю своих подписчиков, но обесценивать, вообще не разу не позволю. И работа любого преподавателя, донести как он может. А ваша задача задать вопросы, чтобы коннект случился. У каждого разный опыт, и здесь 50 на 50, первая половина преподаватель, вторая половина ваша усвоить. А не так что преподаватель делает 100 % угадывая ваши ожидания.
Запомните мир так не работает вообще!
Желаю вам удачи в освоении рекурсии 😘
Если надо спрашивайте вопросы, но без этого, мне не нравится. 😬
@@RuslanNumber1 И кстати, да, я не чувствую никакой обиды, я в своем материале уверена на 200%. По мне так просто пришел чувак со своей агрессией, видимо не с той ноги сегодня встал. Ну я вам ее и возвращаю, зачем она мне ваша агрессия, живите с ней сами.
Вот это ерунда, так что можно понять из такого глупого объяснения это жесть
И в чем же оно глупое?
@@webelart В том что из вашего объяснения не чего не понятно.