Что такое рекурсия. Фундаментальный JavaScript
Вставка
- Опубліковано 27 жов 2020
- Когда функции вызывают сами себя - этот процесс называется рекурсией. И если дальше примера с факториалом вы не продвинулись, то будет полезно визуализировать этот процесс на уровне происходящего в памяти и самом JavaScript. Смотрим на простых примерах. И выполняем задание из урока самостоятельно :-)
#javascript #рекурсия
__
Мои курсы по вебу с купонами:
✅ mishanep.com/
📢 Поддержка канала:
/ mishanep
www.tinkoff.ru/rm/nepomnyasch...
paypal.me/mishanep
Есть два типа людей: одни знают, что такое рекурсия, а другие думают, что есть два типа людей: одни знают, что такое рекурсия, а другие......... {error: out of memory)
Начал тему рекурсия на learn javascript, поймал жёсткий затуп и не понимал почему подставляется x * pow(x, n -1), потом в итоге допёрло что мы умпожаем X на X раз, а n -1 уменьшает количество попыток умножения. Спасибо за видео, среди всех что перебрал, в этом дошло до меня)
а ты мне поиог понять эту формулу)
уже полгода прошло. Как дела с учёбой? Каков прогресс?
Хорошо, а теперь объясни что ты только что сказал, псих:))
Спасибо большое за видео!
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() использован на случай, если пользователь ввёдет число)
Сколько видео пересмотрел никак не мог понять. Но ты так объяснил подробно и разжеванно что меня наконец осенило как это работает Большое тебе человеческое СПАСИБО.
Спасибо! Очень четко и понятно!
Спасибо, уважаемый Михаил! Вы сделали концепцию рекурсии максимально доступной :)
Великолепная подача материала!
Круто, спасибо большое:)
Спасибо за видео. Доходчиво объяснили такую сложную тему.
Круууто😮 спасибо большое ❤
Спасибо! 💯❣Обожаю материалы, подкреплённые схемами/рисунками, к сожалению, не каждый так подробно опишет :) Стали понятнее более сложные примеры)
Очень хорошее видео, благодаря вам я понял рекурсию. Лайк
Спасибо, мил человек.
наконец то я нашел то что я хотел спасибо огромное
Михаил, спасибо!
Пожалуйста =)
отличное объяснение рекурсий, от души
Пасибо, друг!)
Спасибо!
Спасибо за прекрасное объяснение! :)
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));
};
спасибо!
function sum(num) {
return num
Спасибо! Отличное объяснение. Вот мой вариант:
function recurseDivision(a) {
if(a / 10 === 1) return 2
return (1 + recurseDivision(a / 10))
}
Правда, код работает только в том случае, если в аргумент функции приходят только числа 10, 100, 1000 и т.д.
чел... я не знаю, как тебя отблагодарить, это единственное объяснение, которое я отлично понял, господи, спасибо тебе
Рад, что помогло =)
function sumOfDigits(number) {
if (Math.abs(number) < 1) return 0;
return 1 + sumOfDigits(number / 10);
}
Объясните пожалуйста более подробно, какие значения(цифры) подставляются после того, как выполняется базовое условие. 1 возвращается в аргумент функции правильно ли я понимаю(тоесть становится pow(1) ?)У меня получается понять пример и придти к результату 125 только если в return x(5) × pow(1)
x(5) × pow(5)
x(5) × pow(25)
Спасибо! Вроде как разобрался
let count = 0
function sumOfDigits(number) {
if (isNaN(number) === false ) {
count ++
} else {
return console.log('Error')
}
if (Math.floor((number / 10))
Сложная тема для меня. Каждый раз думаешь, что уж тут непонятного, но новая простейшая задача и затык на пол дня. Усугубляется еще и тем, что в реальности не используется, практика не нарабатывается. Мой простейший код с кучей букв:
function sumOfDigit(number){
count = 0
if(number
спасибо, ваше видео очень мне помогло
Немножко тут, немножко там. Каждый найдёт своего объеснятора, которого поймёт)
Очень интересна тема карирования. + карирование с замыканием и рекурсией. Например, когда что-то подобное (3)(5)(4)(5) или (3)(5,6)(4). И самое главное где это в жизни используют?
Карирование, действительно, интересная тема. Другой вопрос, что на реальных проектах этот подход часто используется через доп. библиотеки, чтобы не карировать всё самостоятельно.
Есть отличная либа Ramda JS, а на хабре есть серия статей, как начать с ней работать (ибо карирование и всё, что с ним связано - это отдельный подход в программировании, т.н. функциональный, и многим поначалу он туго заходит, так как классическое образование подразумевает императивный/процедурный подход).
Если интересно, вот первая из цикла статей, там есть ссылки на продолжения
habr.com/ru/post/348868/
@@mishanep спасибо, ознакомлюсь)
Привет, я решил поставить на паузу и сам попробовал решить задачу с копией "Math.pow" и вот что у меня получилось: "return y
function sum(number) {
if(number < 10) {
return 1
} else {
return 1 + sum(number / 10)
}
}
console.log(sum(567489)); // 6
Мой варик :
let count = 0;
function sumOfDigits(number) {
let digits = number.toString();
if (count === digits.length) return 'done';
count++;
return sumOfDigits(number);
}
Оставлю свой вариант)
let a = 0
function sumOfDigits(n){
if (n
округление то зачем тут?))
Підскажіть, будь ласка, навіщо ми створюємо змінну а, і присвоюємо їй +1?
@@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))
function sumOfDigits (num) {
let i = 0;
if (i === 0) return (''+num).length;
return sumOfDigits ()
}
отдуши душевно в душу!
function sumDigits(number) {
if (number < 10) {
return number;
}
let last = number % 10;
let num = Math.floor(number / 10);
return last + sumDigits(num);
}
function sum(number) {
if(number === 1) {
return number
} else {
return 1 + sum(number / 10)
}
}
console.log(sum(100))
не работает от 2 до 9))
function sum(number) {
if(number
каких X умноженное на 5 и - 2? и соответственно 5*5 ?? а как это получается что Х - это 5 * на 5 -2 - это 5*5 ??
Мне кажется, это самый лучший урок по рекурсии, но можно я уточню момент:
1) // function pow (x, y){
// if(y
Спасибо.
Полагаю, это просто ошибка. Иногда, когда говоришь и что-то делаешь одновременно, подобное случается.
@@mishanep да нет, я к тому, что pow(x,n-1) и так 2 в степени n-1? зачем еще это выражение умножать на 2? 2*pow(x,n-1)
@@irynabelaya8191 вероятно, вы не до конца поняли суть рекурсивного процесса. Здесь вычисление результата начинается в самом конце, когда выполнится терминальное условие. Каждый рекурсивный вызов сродни изменению счётчика в обычном цикле. А данном примере мы реализуем возведение в степень, то есть, по сути, умножение числа на само себя n раз. Получается, что на каждом этапе мы как бы подвешиваем исходное число, дожидаясь результата последующего вызова. Всё сводится ожиданию той самой единички в конце. В итоге самая верхняя функция вернёт уже значение 1 и все вызванные до этого функции смогут осуществить свой return, получится такая цепочка:
@@dimeliora Супер-объяснение!!! Разобралась! Спасибо огромное!!!
@@dimeliora спасибо! после вашего комментария все стало понятно 👏🏻
после 17:53 не понятно...
const sum = num => num > 9 ? 1 + sum(num / 10) : 1
В видео не хватает объяснения в чем преимущества рекурсии перед обычной функцией? Возведение в степень можно ведь реализовать и в обычном цикле.
нужнооо!!!
сау брат
Я подписался. Хорошо объясняешь. Я так же на телеграмм канале @bofre нашел книги по JavaScript.
Нихера не понимаю почему при умножении х на функцию мы получаем степень
ты же тоже здесь потому что не мог понять как x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?) x умножается на функцию?)
я так и не понял почему они умножаются, где это условия задано.
@@mamkindotker в возврате
function countOfNumber(number) {
return number < 10 ? 1 : 1 + countOfNumber(Math.floor(number / 10 ));
}
Вот такой получился
на котятах понятнее.
В этом уроке тема не раскрыта и разницы с циклом не видно
на паскале: ua-cam.com/video/d-VzGtdc7QY/v-deo.html
Хз, кто ты, но на learn js объяснили просто ужасно, а тебе спасибо
Не доступно объясняете.. простите
Рекурсия - тема не из простых. С первого раза почти никому не даётся. Попробуйте вернуться к ней через месяц. На самом деле она не так часто используется.
нахрен мне твоя глобальная память??? Впустую потраченное время, бесишь тянуть время.... 5 минут в начале нужно пролистать. За тянулого времени отписка.
Сделал свой вариант. 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))
Эээм)))
const sumOfDigits = num => num.toString().length
или в условии обязательно нужна рекурсия?))))
Обязательно)
У меня тоже сразу же идея преобразовать число в строку)
Получился такой вариант:
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
решение задачи который выдали в конце видео
function sumOfDigits(number){
return number.toString().length
}
console.log(sumOfDigits(094932))
было бы круто написать с рекурсией, но я не могу понять как сделать и какое вставить условие
Рррррррррекурсия, сказала чао)
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));