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

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

КОМЕНТАРІ • 83

  • @pakoo7715
    @pakoo7715 2 роки тому +116

    Есть два типа людей: одни знают, что такое рекурсия, а другие думают, что есть два типа людей: одни знают, что такое рекурсия, а другие......... {error: out of memory)

  • @user-lc6gy2ev5r
    @user-lc6gy2ev5r 3 роки тому +34

    Начал тему рекурсия на learn javascript, поймал жёсткий затуп и не понимал почему подставляется x * pow(x, n -1), потом в итоге допёрло что мы умпожаем X на X раз, а n -1 уменьшает количество попыток умножения. Спасибо за видео, среди всех что перебрал, в этом дошло до меня)

    • @2pizza512
      @2pizza512 3 роки тому +11

      а ты мне поиог понять эту формулу)

    • @dlddlkpkp2312
      @dlddlkpkp2312 2 роки тому +2

      уже полгода прошло. Как дела с учёбой? Каков прогресс?

    • @ggg-tq9be
      @ggg-tq9be 2 роки тому +4

      Хорошо, а теперь объясни что ты только что сказал, псих:))

  • @user-jr9xk8zc8l
    @user-jr9xk8zc8l 8 днів тому

    Спасибо большое за видео!
    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() использован на случай, если пользователь ввёдет число)

  • @glok0517
    @glok0517 3 роки тому +6

    Сколько видео пересмотрел никак не мог понять. Но ты так объяснил подробно и разжеванно что меня наконец осенило как это работает Большое тебе человеческое СПАСИБО.

  • @krislichtschimmer9052
    @krislichtschimmer9052 Рік тому

    Спасибо! Очень четко и понятно!

  • @corpse_obscur
    @corpse_obscur 7 місяців тому

    Спасибо, уважаемый Михаил! Вы сделали концепцию рекурсии максимально доступной :)

  • @vladimirglazkov7960
    @vladimirglazkov7960 Рік тому

    Великолепная подача материала!

  • @user-ub8nm8jd8u
    @user-ub8nm8jd8u 3 роки тому

    Круто, спасибо большое:)

  • @tazorprod.934
    @tazorprod.934 Рік тому

    Спасибо за видео. Доходчиво объяснили такую сложную тему.

  • @mavldr
    @mavldr Рік тому

    Круууто😮 спасибо большое ❤

  • @MaryGor_
    @MaryGor_ 2 роки тому

    Спасибо! 💯❣Обожаю материалы, подкреплённые схемами/рисунками, к сожалению, не каждый так подробно опишет :) Стали понятнее более сложные примеры)

  • @user-zr4ro3xc7b
    @user-zr4ro3xc7b Рік тому

    Очень хорошее видео, благодаря вам я понял рекурсию. Лайк

  • @user-or4gk6ug5j
    @user-or4gk6ug5j Рік тому +1

    Спасибо, мил человек.

  • @eghishemanukyan3021
    @eghishemanukyan3021 Рік тому +1

    наконец то я нашел то что я хотел спасибо огромное

  • @rustambokaev4886
    @rustambokaev4886 3 роки тому +1

    Михаил, спасибо!

    • @mishanep
      @mishanep  3 роки тому

      Пожалуйста =)

  • @etemax
    @etemax 11 місяців тому

    отличное объяснение рекурсий, от души

  • @deorfeal5657
    @deorfeal5657 2 роки тому

    Пасибо, друг!)

  • @Ekaterina-tu7ou
    @Ekaterina-tu7ou 3 роки тому

    Спасибо!

  • @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));
    };

  • @garry2412
    @garry2412 3 роки тому

    спасибо!

  • @Ruslan_Saint_P
    @Ruslan_Saint_P 3 роки тому +3

    function sum(num) {
    return num

  • @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 роки тому +8

    чел... я не знаю, как тебя отблагодарить, это единственное объяснение, которое я отлично понял, господи, спасибо тебе

    • @mishanep
      @mishanep  2 роки тому +3

      Рад, что помогло =)

  • @VOZZZZZZZ
    @VOZZZZZZZ 4 місяці тому

    function sumOfDigits(number) {
    if (Math.abs(number) < 1) return 0;
    return 1 + sumOfDigits(number / 10);
    }

  • @Proxxximo69
    @Proxxximo69 Рік тому

    Объясните пожалуйста более подробно, какие значения(цифры) подставляются после того, как выполняется базовое условие. 1 возвращается в аргумент функции правильно ли я понимаю(тоесть становится pow(1) ?)У меня получается понять пример и придти к результату 125 только если в return x(5) × pow(1)
    x(5) × pow(5)
    x(5) × pow(25)

  • @oleksandrearth6095
    @oleksandrearth6095 Рік тому

    Спасибо! Вроде как разобрался
    let count = 0
    function sumOfDigits(number) {
    if (isNaN(number) === false ) {
    count ++
    } else {
    return console.log('Error')
    }
    if (Math.floor((number / 10))

  • @user-qt1ti3xt2v
    @user-qt1ti3xt2v Рік тому +1

    Сложная тема для меня. Каждый раз думаешь, что уж тут непонятного, но новая простейшая задача и затык на пол дня. Усугубляется еще и тем, что в реальности не используется, практика не нарабатывается. Мой простейший код с кучей букв:
    function sumOfDigit(number){
    count = 0
    if(number

  • @siriusvelikolepniy5188
    @siriusvelikolepniy5188 8 місяців тому

    спасибо, ваше видео очень мне помогло

  • @topsstands9861
    @topsstands9861 3 роки тому +4

    Немножко тут, немножко там. Каждый найдёт своего объеснятора, которого поймёт)
    Очень интересна тема карирования. + карирование с замыканием и рекурсией. Например, когда что-то подобное (3)(5)(4)(5) или (3)(5,6)(4). И самое главное где это в жизни используют?

    • @mishanep
      @mishanep  3 роки тому +2

      Карирование, действительно, интересная тема. Другой вопрос, что на реальных проектах этот подход часто используется через доп. библиотеки, чтобы не карировать всё самостоятельно.
      Есть отличная либа Ramda JS, а на хабре есть серия статей, как начать с ней работать (ибо карирование и всё, что с ним связано - это отдельный подход в программировании, т.н. функциональный, и многим поначалу он туго заходит, так как классическое образование подразумевает императивный/процедурный подход).
      Если интересно, вот первая из цикла статей, там есть ссылки на продолжения
      habr.com/ru/post/348868/

    • @topsstands9861
      @topsstands9861 3 роки тому +1

      @@mishanep спасибо, ознакомлюсь)

  • @immOKDO
    @immOKDO Рік тому

    Привет, я решил поставить на паузу и сам попробовал решить задачу с копией "Math.pow" и вот что у меня получилось: "return y

  • @asmodeus7862
    @asmodeus7862 5 місяців тому

    function sum(number) {
    if(number < 10) {
    return 1
    } else {
    return 1 + sum(number / 10)
    }
    }
    console.log(sum(567489)); // 6

  • @RinHaitani-oy7pj
    @RinHaitani-oy7pj 5 місяців тому

    Мой варик :
    let count = 0;
    function sumOfDigits(number) {
    let digits = number.toString();
    if (count === digits.length) return 'done';
    count++;
    return sumOfDigits(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))

  • @tazorprod.934
    @tazorprod.934 Рік тому

    function sumOfDigits (num) {
    let i = 0;
    if (i === 0) return (''+num).length;
    return sumOfDigits ()
    }

  • @mr.zxzxzxz3816
    @mr.zxzxzxz3816 Рік тому

    отдуши душевно в душу!

  • @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);
    }

  • @dmitriystoyanov933
    @dmitriystoyanov933 3 роки тому +1

    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 роки тому +2

      function sum(number) {
      if(number

  • @andrew-ua
    @andrew-ua 2 роки тому +1

    каких X умноженное на 5 и - 2? и соответственно 5*5 ?? а как это получается что Х - это 5 * на 5 -2 - это 5*5 ??

  • @irynabelaya8191
    @irynabelaya8191 3 роки тому +1

    Мне кажется, это самый лучший урок по рекурсии, но можно я уточню момент:
    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 роки тому +11

      @@irynabelaya8191 вероятно, вы не до конца поняли суть рекурсивного процесса. Здесь вычисление результата начинается в самом конце, когда выполнится терминальное условие. Каждый рекурсивный вызов сродни изменению счётчика в обычном цикле. А данном примере мы реализуем возведение в степень, то есть, по сути, умножение числа на само себя n раз. Получается, что на каждом этапе мы как бы подвешиваем исходное число, дожидаясь результата последующего вызова. Всё сводится ожиданию той самой единички в конце. В итоге самая верхняя функция вернёт уже значение 1 и все вызванные до этого функции смогут осуществить свой return, получится такая цепочка:

    • @irynabelaya8191
      @irynabelaya8191 3 роки тому +1

      @@dimeliora Супер-объяснение!!! Разобралась! Спасибо огромное!!!

    • @user-ge6il3ig4w
      @user-ge6il3ig4w 3 роки тому +1

      @@dimeliora спасибо! после вашего комментария все стало понятно 👏🏻

  • @mariaruslit310
    @mariaruslit310 Рік тому +1

    после 17:53 не понятно...

  • @alekseymakhov9656
    @alekseymakhov9656 Рік тому

    const sum = num => num > 9 ? 1 + sum(num / 10) : 1

  • @xOceanSpirit
    @xOceanSpirit 3 роки тому +4

    В видео не хватает объяснения в чем преимущества рекурсии перед обычной функцией? Возведение в степень можно ведь реализовать и в обычном цикле.

  • @piter2450
    @piter2450 3 роки тому

    сау брат

  • @magomedmycaev7080
    @magomedmycaev7080 3 роки тому

    Я подписался. Хорошо объясняешь. Я так же на телеграмм канале @bofre нашел книги по JavaScript.

  • @rustyblade2647
    @rustyblade2647 9 місяців тому +1

    Нихера не понимаю почему при умножении х на функцию мы получаем степень

  • @JackSteamBoy
    @JackSteamBoy Рік тому +2

    ты же тоже здесь потому что не мог понять как x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?)

    • @mamkindotker
      @mamkindotker 2 місяці тому

      я так и не понял почему они умножаются, где это условия задано.

    • @JackSteamBoy
      @JackSteamBoy 2 місяці тому

      @@mamkindotker в возврате

  • @sviatbondar1721
    @sviatbondar1721 Рік тому +1

    function countOfNumber(number) {
    return number < 10 ? 1 : 1 + countOfNumber(Math.floor(number / 10 ));
    }
    Вот такой получился

  • @user-uw1th6vr3i
    @user-uw1th6vr3i 2 роки тому

    на котятах понятнее.

  • @user-jf6fs9vg3l
    @user-jf6fs9vg3l Рік тому

    В этом уроке тема не раскрыта и разницы с циклом не видно

  • @alexej_mihailovich
    @alexej_mihailovich 3 роки тому

    на паскале: ua-cam.com/video/d-VzGtdc7QY/v-deo.html

  • @tomanad8321
    @tomanad8321 Рік тому

    Хз, кто ты, но на learn js объяснили просто ужасно, а тебе спасибо

  • @user-dk4vz9qu1t
    @user-dk4vz9qu1t Рік тому +1

    Не доступно объясняете.. простите

    • @mishanep
      @mishanep  Рік тому

      Рекурсия - тема не из простых. С первого раза почти никому не даётся. Попробуйте вернуться к ней через месяц. На самом деле она не так часто используется.

  • @logius84
    @logius84 3 роки тому

    нахрен мне твоя глобальная память??? Впустую потраченное время, бесишь тянуть время.... 5 минут в начале нужно пролистать. За тянулого времени отписка.

  • @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))

  • @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

  • @SadBatya
    @SadBatya 11 місяців тому

    решение задачи который выдали в конце видео
    function sumOfDigits(number){
    return number.toString().length
    }
    console.log(sumOfDigits(094932))

    • @SadBatya
      @SadBatya 11 місяців тому

      было бы круто написать с рекурсией, но я не могу понять как сделать и какое вставить условие

    • @rustyblade2647
      @rustyblade2647 9 місяців тому

      Рррррррррекурсия, сказала чао)

  • @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));