Что такое рекурсия. Фундаментальный JavaScript

  Рет қаралды 21,606

Михаил Непомнящий

Михаил Непомнящий

3 жыл бұрын

Когда функции вызывают сами себя - этот процесс называется рекурсией. И если дальше примера с факториалом вы не продвинулись, то будет полезно визуализировать этот процесс на уровне происходящего в памяти и самом JavaScript. Смотрим на простых примерах. И выполняем задание из урока самостоятельно :-)
#javascript #рекурсия
__
Мои курсы по вебу с купонами:
✅ mishanep.com/
📢 Поддержка канала:
/ mishanep
www.tinkoff.ru/rm/nepomnyasch...
paypal.me/mishanep

Пікірлер: 83
@pakoo7715
@pakoo7715 2 жыл бұрын
Есть два типа людей: одни знают, что такое рекурсия, а другие думают, что есть два типа людей: одни знают, что такое рекурсия, а другие......... {error: out of memory)
@user-lc6gy2ev5r
@user-lc6gy2ev5r 3 жыл бұрын
Начал тему рекурсия на learn javascript, поймал жёсткий затуп и не понимал почему подставляется x * pow(x, n -1), потом в итоге допёрло что мы умпожаем X на X раз, а n -1 уменьшает количество попыток умножения. Спасибо за видео, среди всех что перебрал, в этом дошло до меня)
@2pizza512
@2pizza512 3 жыл бұрын
а ты мне поиог понять эту формулу)
@dlddlkpkp2312
@dlddlkpkp2312 2 жыл бұрын
уже полгода прошло. Как дела с учёбой? Каков прогресс?
@ggg-tq9be
@ggg-tq9be 2 жыл бұрын
Хорошо, а теперь объясни что ты только что сказал, псих:))
@glok0517
@glok0517 3 жыл бұрын
Сколько видео пересмотрел никак не мог понять. Но ты так объяснил подробно и разжеванно что меня наконец осенило как это работает Большое тебе человеческое СПАСИБО.
@user-jr9xk8zc8l
@user-jr9xk8zc8l 19 күн бұрын
Спасибо большое за видео! let count = 0; function sumOfDigits (string) { if (count == string.length) { return "finished" } count++; return sumOfDigits(string) } console.log (sumOfDigits(String('Hi!'))); console.log("your string has a length =", count) У меня получилось вот так. Метод String() использован на случай, если пользователь ввёдет число)
@MaryGor_
@MaryGor_ 2 жыл бұрын
Спасибо! 💯❣Обожаю материалы, подкреплённые схемами/рисунками, к сожалению, не каждый так подробно опишет :) Стали понятнее более сложные примеры)
@corpse_obscur
@corpse_obscur 7 ай бұрын
Спасибо, уважаемый Михаил! Вы сделали концепцию рекурсии максимально доступной :)
@vladimirglazkov7960
@vladimirglazkov7960 Жыл бұрын
Великолепная подача материала!
@user-ub8nm8jd8u
@user-ub8nm8jd8u 3 жыл бұрын
Круто, спасибо большое:)
@krislichtschimmer9052
@krislichtschimmer9052 Жыл бұрын
Спасибо! Очень четко и понятно!
@user-or4gk6ug5j
@user-or4gk6ug5j Жыл бұрын
Спасибо, мил человек.
@tazorprod.934
@tazorprod.934 Жыл бұрын
Спасибо за видео. Доходчиво объяснили такую сложную тему.
@mavldr
@mavldr Жыл бұрын
Круууто😮 спасибо большое ❤
@rustambokaev4886
@rustambokaev4886 3 жыл бұрын
Михаил, спасибо!
@mishanep
@mishanep 3 жыл бұрын
Пожалуйста =)
@etemax
@etemax 11 ай бұрын
отличное объяснение рекурсий, от души
@user-zr4ro3xc7b
@user-zr4ro3xc7b Жыл бұрын
Очень хорошее видео, благодаря вам я понял рекурсию. Лайк
@eghishemanukyan3021
@eghishemanukyan3021 Жыл бұрын
наконец то я нашел то что я хотел спасибо огромное
@deorfeal5657
@deorfeal5657 2 жыл бұрын
Пасибо, друг!)
@Anonym-li8eb
@Anonym-li8eb 8 ай бұрын
Спасибо за прекрасное объяснение! :) 1: const sumOfDigits = (n) => (n < 10 ? 1 : 1 + sumOfDigits(Math.floor(n / 10))); 2: const sumOfDigits = (n) => { if (n % 10 === n) return 1; return 1 + sumOfDigits(Math.floor(n / 10)); };
@Ekaterina-tu7ou
@Ekaterina-tu7ou 3 жыл бұрын
Спасибо!
@Ruslan_Saint_P
@Ruslan_Saint_P 3 жыл бұрын
function sum(num) { return num
@user-qt1ti3xt2v
@user-qt1ti3xt2v Жыл бұрын
Сложная тема для меня. Каждый раз думаешь, что уж тут непонятного, но новая простейшая задача и затык на пол дня. Усугубляется еще и тем, что в реальности не используется, практика не нарабатывается. Мой простейший код с кучей букв: function sumOfDigit(number){ count = 0 if(number
@garry2412
@garry2412 3 жыл бұрын
спасибо!
@user-fk3iz4re4p
@user-fk3iz4re4p 8 ай бұрын
Спасибо! Отличное объяснение. Вот мой вариант: function recurseDivision(a) { if(a / 10 === 1) return 2 return (1 + recurseDivision(a / 10)) } Правда, код работает только в том случае, если в аргумент функции приходят только числа 10, 100, 1000 и т.д.
@markmybeats
@markmybeats 2 жыл бұрын
чел... я не знаю, как тебя отблагодарить, это единственное объяснение, которое я отлично понял, господи, спасибо тебе
@mishanep
@mishanep 2 жыл бұрын
Рад, что помогло =)
@oleksandrearth6095
@oleksandrearth6095 Жыл бұрын
Спасибо! Вроде как разобрался let count = 0 function sumOfDigits(number) { if (isNaN(number) === false ) { count ++ } else { return console.log('Error') } if (Math.floor((number / 10))
@Proxxximo69
@Proxxximo69 Жыл бұрын
Объясните пожалуйста более подробно, какие значения(цифры) подставляются после того, как выполняется базовое условие. 1 возвращается в аргумент функции правильно ли я понимаю(тоесть становится pow(1) ?)У меня получается понять пример и придти к результату 125 только если в return x(5) × pow(1) x(5) × pow(5) x(5) × pow(25)
@topsstands9861
@topsstands9861 3 жыл бұрын
Немножко тут, немножко там. Каждый найдёт своего объеснятора, которого поймёт) Очень интересна тема карирования. + карирование с замыканием и рекурсией. Например, когда что-то подобное (3)(5)(4)(5) или (3)(5,6)(4). И самое главное где это в жизни используют?
@mishanep
@mishanep 3 жыл бұрын
Карирование, действительно, интересная тема. Другой вопрос, что на реальных проектах этот подход часто используется через доп. библиотеки, чтобы не карировать всё самостоятельно. Есть отличная либа Ramda JS, а на хабре есть серия статей, как начать с ней работать (ибо карирование и всё, что с ним связано - это отдельный подход в программировании, т.н. функциональный, и многим поначалу он туго заходит, так как классическое образование подразумевает императивный/процедурный подход). Если интересно, вот первая из цикла статей, там есть ссылки на продолжения habr.com/ru/post/348868/
@topsstands9861
@topsstands9861 3 жыл бұрын
@@mishanep спасибо, ознакомлюсь)
@VOZZZZZZZ
@VOZZZZZZZ 5 ай бұрын
function sumOfDigits(number) { if (Math.abs(number) < 1) return 0; return 1 + sumOfDigits(number / 10); }
@immOKDO
@immOKDO Жыл бұрын
Привет, я решил поставить на паузу и сам попробовал решить задачу с копией "Math.pow" и вот что у меня получилось: "return y
@mr.zxzxzxz3816
@mr.zxzxzxz3816 Жыл бұрын
отдуши душевно в душу!
@RinHaitani-oy7pj
@RinHaitani-oy7pj 6 ай бұрын
Мой варик : let count = 0; function sumOfDigits(number) { let digits = number.toString(); if (count === digits.length) return 'done'; count++; return sumOfDigits(number); }
@dmitriystoyanov933
@dmitriystoyanov933 3 жыл бұрын
function sum(number) { if(number === 1) { return number } else { return 1 + sum(number / 10) } } console.log(sum(100))
@redalert7658
@redalert7658 3 жыл бұрын
не работает от 2 до 9))
@redalert7658
@redalert7658 3 жыл бұрын
function sum(number) { if(number
@user-eo8xm4rw6o
@user-eo8xm4rw6o 2 жыл бұрын
Оставлю свой вариант) let a = 0 function sumOfDigits(n){ if (n
@viktorpavlenko9949
@viktorpavlenko9949 2 жыл бұрын
округление то зачем тут?))
@user-tr4om4to5z
@user-tr4om4to5z Жыл бұрын
Підскажіть, будь ласка, навіщо ми створюємо змінну а, і присвоюємо їй +1?
@user-fd1np4pt7y
@user-fd1np4pt7y Жыл бұрын
​@@user-tr4om4to5z це поганий приклад, так як викликати функцію в консолі кілька разів, то результат буде поганий. типу console.log( sumOfDigits(12)); console.log( sumOfDigits(12222)) змінну потрібно створювати в середині функції. ось для прикладу function numberLengRecursion(num){ let count = 1; if(num / 10 > 1){ return 1 + numberLengRecursion(num/10); } else { return 1; } } console.log(numberLengRecursion(250)) console.log(numberLengRecursion(25000))
@asmodeus7862
@asmodeus7862 6 ай бұрын
function sum(number) { if(number < 10) { return 1 } else { return 1 + sum(number / 10) } } console.log(sum(567489)); // 6
@tazorprod.934
@tazorprod.934 Жыл бұрын
function sumOfDigits (num) { let i = 0; if (i === 0) return (''+num).length; return sumOfDigits () }
@VaheOhanyan-ig7cj
@VaheOhanyan-ig7cj 10 ай бұрын
function sumDigits(number) { if (number < 10) { return number; } let last = number % 10; let num = Math.floor(number / 10); return last + sumDigits(num); }
@andrew-ua
@andrew-ua 2 жыл бұрын
каких X умноженное на 5 и - 2? и соответственно 5*5 ?? а как это получается что Х - это 5 * на 5 -2 - это 5*5 ??
@xOceanSpirit
@xOceanSpirit 3 жыл бұрын
В видео не хватает объяснения в чем преимущества рекурсии перед обычной функцией? Возведение в степень можно ведь реализовать и в обычном цикле.
@jamsfarhatovna7651
@jamsfarhatovna7651 Жыл бұрын
нужнооо!!!
@siriusvelikolepniy5188
@siriusvelikolepniy5188 9 ай бұрын
спасибо, ваше видео очень мне помогло
@irynabelaya8191
@irynabelaya8191 3 жыл бұрын
Мне кажется, это самый лучший урок по рекурсии, но можно я уточню момент: 1) // function pow (x, y){ // if(y
@mishanep
@mishanep 3 жыл бұрын
Спасибо. Полагаю, это просто ошибка. Иногда, когда говоришь и что-то делаешь одновременно, подобное случается.
@irynabelaya8191
@irynabelaya8191 3 жыл бұрын
​@@mishanep да нет, я к тому, что pow(x,n-1) и так 2 в степени n-1? зачем еще это выражение умножать на 2? 2*pow(x,n-1)
@dimeliora
@dimeliora 3 жыл бұрын
@@irynabelaya8191 вероятно, вы не до конца поняли суть рекурсивного процесса. Здесь вычисление результата начинается в самом конце, когда выполнится терминальное условие. Каждый рекурсивный вызов сродни изменению счётчика в обычном цикле. А данном примере мы реализуем возведение в степень, то есть, по сути, умножение числа на само себя n раз. Получается, что на каждом этапе мы как бы подвешиваем исходное число, дожидаясь результата последующего вызова. Всё сводится ожиданию той самой единички в конце. В итоге самая верхняя функция вернёт уже значение 1 и все вызванные до этого функции смогут осуществить свой return, получится такая цепочка:
@irynabelaya8191
@irynabelaya8191 3 жыл бұрын
@@dimeliora Супер-объяснение!!! Разобралась! Спасибо огромное!!!
@user-ge6il3ig4w
@user-ge6il3ig4w 3 жыл бұрын
@@dimeliora спасибо! после вашего комментария все стало понятно 👏🏻
@mariaruslit310
@mariaruslit310 Жыл бұрын
после 17:53 не понятно...
@piter2450
@piter2450 3 жыл бұрын
сау брат
@alekseymakhov9656
@alekseymakhov9656 Жыл бұрын
const sum = num => num > 9 ? 1 + sum(num / 10) : 1
@JackSteamBoy
@JackSteamBoy Жыл бұрын
ты же тоже здесь потому что не мог понять как x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?)
@mamkindotker
@mamkindotker 2 ай бұрын
я так и не понял почему они умножаются, где это условия задано.
@JackSteamBoy
@JackSteamBoy 2 ай бұрын
@@mamkindotker в возврате
@magomedmycaev7080
@magomedmycaev7080 3 жыл бұрын
Я подписался. Хорошо объясняешь. Я так же на телеграмм канале @bofre нашел книги по JavaScript.
@sviatbondar1721
@sviatbondar1721 Жыл бұрын
function countOfNumber(number) { return number < 10 ? 1 : 1 + countOfNumber(Math.floor(number / 10 )); } Вот такой получился
@rustyblade2647
@rustyblade2647 9 ай бұрын
Нихера не понимаю почему при умножении х на функцию мы получаем степень
@user-jf6fs9vg3l
@user-jf6fs9vg3l Жыл бұрын
В этом уроке тема не раскрыта и разницы с циклом не видно
@user-uw1th6vr3i
@user-uw1th6vr3i 2 жыл бұрын
на котятах понятнее.
@user-dk4vz9qu1t
@user-dk4vz9qu1t Жыл бұрын
Не доступно объясняете.. простите
@mishanep
@mishanep Жыл бұрын
Рекурсия - тема не из простых. С первого раза почти никому не даётся. Попробуйте вернуться к ней через месяц. На самом деле она не так часто используется.
@andrTaylor
@andrTaylor Жыл бұрын
Сделал свой вариант. x ^ 0 чекает является ли число целым. Как только оно вещественным становится после деления на 10 - получаем (например 0.5) то выходим с цикла рекурсивного и далее у нас сложение единиц идёт подряд - от последней до самой первой. function sumOfDigits(x: number): number { if ((x ^ 0 ) !== x) return 0 return 1 + sumOfDigits(x / 10) } console.log(sumOfDigits(1000))
@tomanad8321
@tomanad8321 Жыл бұрын
Хз, кто ты, но на learn js объяснили просто ужасно, а тебе спасибо
@alexej_mihailovich
@alexej_mihailovich 3 жыл бұрын
на паскале: kzfaq.info/get/bejne/mpOGraqlycmbgY0.html
@logius84
@logius84 3 жыл бұрын
нахрен мне твоя глобальная память??? Впустую потраченное время, бесишь тянуть время.... 5 минут в начале нужно пролистать. За тянулого времени отписка.
@SadBatya
@SadBatya Жыл бұрын
решение задачи который выдали в конце видео function sumOfDigits(number){ return number.toString().length } console.log(sumOfDigits(094932))
@SadBatya
@SadBatya Жыл бұрын
было бы круто написать с рекурсией, но я не могу понять как сделать и какое вставить условие
@rustyblade2647
@rustyblade2647 9 ай бұрын
Рррррррррекурсия, сказала чао)
@MaksTrueman
@MaksTrueman Жыл бұрын
Эээм))) const sumOfDigits = num => num.toString().length или в условии обязательно нужна рекурсия?))))
@mishanep
@mishanep Жыл бұрын
Обязательно)
@n3trnnr
@n3trnnr Жыл бұрын
У меня тоже сразу же идея преобразовать число в строку) Получился такой вариант: let result: number = 0 const sum = (number: any) => { const nLength = number.toString() if (nLength.length === 0) { return false } result += 1 const remainder = nLength.slice(1) sum(remainder) } sum(1000)//4
@user-wk4tq2xk6e
@user-wk4tq2xk6e Жыл бұрын
let count = 0 const sumOfDigits = (num) => { if (typeof num !== 'number') { return 'не число'; } if (num < 1) { return count; } count++; return sumOfDigits(num / 10); }; console.log(sumOfDigits(9000));
Замыкания в JavaScript с примерами. Фундаментальный JavaScript
22:39
100❤️ #shorts #construction #mizumayuuki
00:18
MY💝No War🤝
Рет қаралды 18 МЛН
Osman Kalyoncu Sonu Üzücü Saddest Videos Dream Engine 118 #shorts
00:30
NO NO NO YES! (50 MLN SUBSCRIBERS CHALLENGE!) #shorts
00:26
PANDA BOI
Рет қаралды 101 МЛН
Когда на улице Маябрь 😈 #марьяна #шортс
00:17
Деструктуризация объектов. Фундаментальный JavaScript
15:28
Асинхронные функции. Фундаментальный JavaScript
12:27
Михаил Непомнящий
Рет қаралды 14 М.
Деструктуризация массивов. Фундаментальный JavaScript
15:20
Рекурсия. Репка и матрёшка
18:37
Тимофей Хирьянов
Рет қаралды 115 М.
Контекст вызова функции. Фундаментальный JavaScript
21:51
Михаил Непомнящий
Рет қаралды 20 М.
100❤️ #shorts #construction #mizumayuuki
00:18
MY💝No War🤝
Рет қаралды 18 МЛН