Скажите пожалуйста в чём отличие рекурсии от цикла? Ведь в цикле тоже можно организовать вычисление факториала или любой другой последовательности? Заранее спасибо
меня прямо на улыбку тянет, когда понимаю как всё это работает, особенно когда потом написал это, проверил в отладчике. Просто слов нет. Спасибо большое
Спасибо огромное! Теория у вас -- это прекрасно, но на практике становится ещё яснее и непосильная задача уже не кажется такой трудной. Благодарю, что делитесь знаниями!
"если вы не смотрели предыдущих урока то вам лучше этого не видеть " Я посмотрел все)))) И мой Мозг всеравно взорвался))))) Но что такое рекурсия я понял, спасибо))
Спасибо большое, Сергей. Вы очень доходчиво объясняете тему. Уже давно понял, что вместо лекций 70 летних пердунов по программированию, которые очень скучно и нехотя объясняют материал, нужно смотреть вас. Они пытаются донести материал так, как будто мы уже до этого все знали и это просто повторение, постоянно спешат, бубнят. Короче, после лекции отбивается желание вообще заниматься программированием. А вы молодец. Так держать!
Для тех, кто не знает, зачем и для чего нужна рекурсия и будет ли возможность столкнуться с ней в реальном проекте. Начнём с того, что в реальных проектах в 90% случаях вам вообще не придётся работать с математикой, а если и будете, то для этого у вас в арсенале будет какой-нибудь фреймворк. Саму рекурсию используют для каких-либо вычислений, но также эти же вычисления можно реализовать с помощью цикла. Правда, в некоторых случаях(с которыми вы, вероятнее всего, редко будете сталкиваться) удобнее использовать рекурсию за счёт её простоты реализации. Но стоит помнить, что используя рекурсию, вы рискуете получить провал стека, который привод к падению вашего приложения. Итог: Рекурсия - просто, но с риском. Цикл - просто, либо сложно, НО без риска получить крах всего приложения.
@@vitaliivynnyk9642 Спасибо)) - крутая тема на первый взгляд в сортировке, я даже не думал что за пять минут увижу так много вариантов сортировки в инете)) - буду разберется если время позволит)
Чётко и по делу, в общем как всегда, спасибо за видеоролик, за 10 минут изложили всю суть как это делается, а потом еще очень разжевано объяснили принцип работы, слёту лайк!!!
* начал активно рекурсивно думать * ...начинаю изучать рекурсию -> чтобы ее понять, надо ее изучить -> начинаю изучать рекурсию -> чтобы ее понять, надо ее изучить... void learnRecursive() { return learnRecursive(); }
Пришёл сюда из плейлиста по C#, чтобы поподробнее изучить данную тему. Очень доходчиво разъяснено. Большое спасибо! Не пойму людей, которые ставят дизы на такие информативные и понятные видосы. Если это из-за несущественной в данной ситуации погрешности в виде 0! = 0, то таким людям не угодить. Суть видео совсем не в этом.
@@Empty_line потому что до возврата результата умножения функция Fact вызывает сама себя ещё раз. Если бы сразу произошло умножение и функция вернула его результат, то она (функция Fact) уже не вызвала бы себя и никакой рекурсии не было. После возврата результата функцией любой код, который следует строками ниже return, не будет выполняться. Можете даже попробовать с чем-нибудь простым. Напишите функцию, которая выполняет результат сложения двух чисел, а ниже (имеется в виду в теле этой же функции) ещё какой-нибудь код. Visual Studio вам даже затемнит этот код, подсказывая, что он недостижим, а потому и не выполнится. То же самое и здесь
@@Empty_line посмотри, где N умножается на N-1. Причём не просто на N-1, а Fact(N - 1), т.е. функция сама себя ещё раз вызывает. Это всё происходит в return. Ты знаешь, что делает оператор return? Он завершает выполнение функции и возвращает управление вызывающей функции. Но прикол в том, что в данном случае в нём же (в return) снова вызывается эта же функция, но только с уменьшенным на единицу N. Поэтому return пока что не завершает выполнение функции и ещё не возвращает управление вызывающей функции. Сначала обязана вызваться функция Fact(N - 1). Поэтому сразу и не происходит умножения N на N-1. Если бы return проигнорировал Fact(N - 1), то функция не вызвала бы сама себя и никакой рекурсии не было бы.
Разобрал по полочкам и все прям найс! Понимание этого на деле просто! Ну если конечно не углубляться в тонкости работы этого всего (одного только стэка) Но щас этого более чем хватает!
чем больше смотришь видео, тем больше хочется смотреть дальше. затягивает как сериал))) у нас сейчас в компьютерной академии закончился курс ООП и начинается С#. мы всей группой надеемся что у вас скоро появятся обучающие ролики по этому языку. очень-очень ждем. спасибо за ваш труд!
Ха, самое интересно что благодаря 2-ум предыдущим урокам ( про стеки и рекурсии ) , я перед тем как смотреть видео решил сам написать код , который будет искать факториал. После потного часика все-таки написал САМ не смотрев видео! Спасибо вам больше за труды, подача настолько понятное, что ну вообще вопросов не остается! С меня донатик с первой ЗП, хех) P.S вот код кому интересно. int FACT(int a) { if (a > 1) { a = a - 1; return a * FACT(a); } else { return a; } } int factorial(int a) { if (a > 1) { a = a * FACT(a); } return a; } int main () { int a = factorial(3); cout
У вас классные уроки!) Все сразу становится просто и понятно) Задонатил 100 руб в качестве благодарности за ваш труд, ваши уроки бесценны) Спасибо Вам!)
Нет, факториал отрицательных целых чисел вычислять нельзя, т.к. именно в них гамма-функция имеет разрывы. А на всей оставшейся комплексной плоскости эта функция определена збс.
вычислить факториал отрицательных чисел нельзя. Гамма-функция там стремится в + или - бесконечность. Но у гамма-фунции существует аналитическое продолжение где она определена в комплексной плоскости. К стати гамма-функция существует для нецелых значений, и что интересно можно посчитать факториал дробных чисел.
Спасибо. "Разжевал" так, что даже мой кот понял ) Единственное, что вместо 2-х if использовать 1 ( сути никак не меняет) int fact (int n) { if (n > 1) { return n = n * fact(n - 1); } return n; }
Факториал числа это произведение чисел от 1 до N! включительно. 7!=1*2*3*4*5*6*7 1:49 - Что необходимо для вычисления факториала числа 2 ? 4:24 - Вычисляем факториал числа 5:06 - Формула факториала числа 5:49 - Условие выхода из цикла 6:45 - Вызов функции вычисления факториала числа 7:55 - Проверяем работу функции отладчиком
Спасибо спасибо спасииибо вам огромное!!!!Сразу понятен стал смысл рекурсии, а то препод что-то набубнил быстро-быстро такую довольно специфическую тему, и все, разбирайтесь сами😒
if(N == 0) return 0; Не нужно это, я без него запускаю и всё работает, ибо после слова return функция останавливается, ещё с питона знаю. А так курс чёткий, моё уважение).
Практическое применение рекурсии используется при обходе древовидных структур с заранее не известным количеством ветвей. Например файловая система компьютера или парсинг xml документа.
Нашел на одном форуме может кому будет полезно: Просто всё дело в том что факториал имеет более глубокое комбинаторное значение, то есть это не просто некое произведение, а количество перестановок множества из n элементов. Например, элементы множества {A,B,C,D} можно линейно упорядочить 4!=24 способами. А вот множество из нуля элементов, имеет по определению один НУЛЕВОЙ эллемент, поэтому и перестановка там только одна. Хотя и множество из одного эллемента тоже имеет один - ненулевой эллемент, поэтому она там тоже одна. зы Я с матфака
Я сделал немного подругому, но с добавлением переменной i (итерация). У вас безусловно решение лучше) Может если бы знал про формулу, то решил бы так же. Но её я не знал и решал, так сказать, через своё понимание) #include using namespace std; int fc(int i, int n = 1) { if (i < 1) { return n; } n *= i; return fc (--i, n); } int main() { cout
if (n < 2) return 1; Функция вызывает саму себя, до тех пор, пока аргумент не подходит под условие выхода из функции. В то время, пока функция вызывает саму себя (уменьшается значение аргумента). Как аргумент подошел к значению в условии выхода из функции - в этот момент самая глубокая функция получает возвращаемую единицу (можно считать это первой вычисленной функцией). После этого начинается обратный процесс, умножение результата функции на аргумент, который постепенно увеличивается (до начального значения).
Спасибо за урок, и объяснение алгоритма! Вопрос для моего понимания при попытке вычислить факторил числа больше 17, мы получаем отрицательное значение. Насколько я понимаю это связано с типом используемой переменной int которая не может поместить данное значение? Какой самый большой тип хранения целых чисел мы можем использовать ? cout
Это переполнение данных. unsigned long long int максимальный тип для целых беззнаковых чисел. Если нужно ещё больше то уже нужно смотреть в сторону библиотек с реализацией чего - то типа BigInteger. У меня такой необходимости не возникало, так что более точно не скажу.
N! = 1*2*3* ... *(N-1)*N по определению, а 0! = 1 просто по соглашению, так как это помогает записывать в общем виде некоторые выражения, не оговаривая отдельно нулевой случай(например, биномиальные коэффициенты или количество выборок из n по k)
Приведу пример рекурсии: Решение лабиринта: Лабиринт можно представить в виде сетки клеток, где одни клетки заблокированы, а другие открыты. Для исследования лабиринта можно использовать рекурсивную функцию, пытаясь найти путь от начальной точки до конечной.
Для тех кто не понял объясняю вкратце суть всех трех уроков: 1) `Рекурсия` разбивается на задачи и записывается в стэк (очередь), задачи выполняются последовательно сверху вниз и работают по правилу: `последним зашел, первым вышел`. 2) Факториал числа - это произведение натуральных чисел от 1 до самого числа (включая данное число). Обозначается факториал восклицательным знаком «!». пример: 3! = 1 · 2 · 3 = 6 3) Принцип работы: сначала записываются данные из выражения рекурсии (N = 5 - 1), потом происходит последовательный вызов и выполнение возвращаемого значения рекурсии сверху вниз: ``` (return 2 * (2 - 1)) * (return 3) * (return 4) * (return 5) = 120) ```
Вот, как посчитать факториал больших чисел, например, 1000! считается хорошо: #include using namespace std; int main() { int N, i, k, p, carry, Num_Digits; int Big_Factorial[750]; // Вводим массив с 750 элементами, у каждого из которых будет не более 4 цифр, таким образом всего в массив вмещается 3000 цифр, чего наверняка хватит для расчета факториала 1000! и меньше cout > N)) // Проверяем, не являются ли введенные символы буквами (защита от дурака) { cout 1000) { cout
Автор молодец, объясняет доходчиво! Это лучшее объяснение из всех, что я видел! Но у меня складывается мнение, что лучше избегать рекурсий или заменять их на циклы, потому как с ними один большой геморрой: то у рекурсий постоянно stackoverflow, то сам механизм рекурсии очень сложен. пока автор объясняет, вроде бы понятно, как только самому что-нибудь сделать надо, то делаю методом тыка. Вот так-то!!! Интересно, можно ли в программировании совсем обойтись без рекурсии?
Попытался сделать сам перед началом видео, вышло так, вроде работает int rez = 1; int fact(int a) { if (a == 1 || a==0) return rez; rez *= a; a - - ; return fact(a); } void main() { setlocale(LC_ALL, "rus"); fact(5); cout
Что такое факториал - помню с вуза, поэтому решил попробовать организовать его вычисление до просмотра этого урока. Саму формулу нахождения факториала Н!=Н*(Н-1)! разумеется уже не помнил, но посидев подумав, и следуя от обратного, что Н!=1*2*3*..*Н у меня в итоге в программе вышла та же формула нахождения факториала, только "вывернутая", :) Вот моя функция: int factorial(int a) { if (a == 1) return a; a--; return factorial(a)*(a+1); }
Видимо код ты писал на скорую руку и не в vs code. У тебя неверный код, он не сработает как надо, тк как ты в параметре цикла сделал дикремент i, а внутри самого цикла увеличил, то есть сначала он увеличит на 1, а потом уменьшит когда цикл сработает 1 раз. Иначе говоря переменная i так и останется 1. Вот более верный код: int N = 5; if (N == 0) { std::cout
суть ролика - показать как работает рекурсия, а у вас минимум 3 ошибки в коде и 1 неточность. 3 ошибки: 1. нет объявления Count - int Count 2. нет объявления i в цикле for - for ( *int* i = 1; i > a; for (a; a > 0; a--) { count *= a; } cout
@@laim3756 Спасибо, что поправили. Я стараюсь больше таких глупостей не писать. Коль скоро Вы соображаете в Сях, то можно ли заменить весь цикл for на while (a - -) count *= a; Посидел, подумал. Наверное, надо тогда магическое число добавить int a; cin >> a + 1; Иначе факториал до предыдущего числа посчитает.
Аааа, спасибо! Я как раз не могла эту тему понять, а тут всё очень чётко объяснено! А почему ты используешь void main, а не int main, как обычно делают?
Доброго дня. Пробовала разные значения присваивать функции Fact(). Начиная с 20 выводятся отрицательные значения. Почему так? UPD: Все, разобралась. Слишком большое число получается. С long long все работает хорошо)
Забыл сказать, что рекурсивный алгоритм нахождения факториала - одно из возможных заданий которое вам могут дать на собеседовании! =)
Спасибо
факториал нуля это же единица? или как
#include
#include
using namespace std;
int fack(int a)
{
if (a < 0)
{
cout
Отличный пример.
Скажите пожалуйста в чём отличие рекурсии от цикла? Ведь в цикле тоже можно организовать вычисление факториала или любой другой последовательности? Заранее спасибо
if(видео крутое)
{
поставить лайк;
}
cout
int a = 100500;
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
cout
@@MrGray-rk9zu вы уверены?
else
{
Тоже поставить лайк;
}
круглые скобки забыл, ведь жто должно быть функцией. А не переменной
Отличный канал от самых азов до...
З.Ы. По общепринятому соглашению 0!=1 ;)
Самое лучшее объяснение на свете по поводу рекурсии, красава Серёг, всех благ тебе !!!
Небольшая опечатка:
0! = 1
Поэтому код функции Fact должен быть таким:
int Fact (int N)
{
if (N == 0 || N == 1)
return 1;
return N * Fact (N-1);
}
лучше написать if (n == 0) - код красивее будет, асимптотика не поменяется
Если 0 тогда return 0, если 1 return - 1 у него.
Луше && вместо ||
@@НиколайСериков-17 N не может одновременно принимать 2 значения.
@@НиколайСериков-17 && - войдет в тело if если два условие будут равны. N (переменная с урока) не будет 0 и 1 одновременно.
меня прямо на улыбку тянет, когда понимаю как всё это работает, особенно когда потом написал это, проверил в отладчике. Просто слов нет. Спасибо большое
Спасибо огромное! Теория у вас -- это прекрасно, но на практике становится ещё яснее и непосильная задача уже не кажется такой трудной. Благодарю, что делитесь знаниями!
"если вы не смотрели предыдущих урока то вам лучше этого не видеть "
Я посмотрел все)))) И мой Мозг всеравно взорвался)))))
Но что такое рекурсия я понял, спасибо))
Спасибо большое, Сергей. Вы очень доходчиво объясняете тему. Уже давно понял, что вместо лекций 70 летних пердунов по программированию, которые очень скучно и нехотя объясняют материал, нужно смотреть вас. Они пытаются донести материал так, как будто мы уже до этого все знали и это просто повторение, постоянно спешат, бубнят. Короче, после лекции отбивается желание вообще заниматься программированием. А вы молодец. Так держать!
Огромный титанический труд .Редкость в эфире всякой мути.
Для тех, кто не знает, зачем и для чего нужна рекурсия и будет ли возможность столкнуться с ней в реальном проекте.
Начнём с того, что в реальных проектах в 90% случаях вам вообще не придётся работать с математикой, а если и будете, то для этого у вас в арсенале будет
какой-нибудь фреймворк.
Саму рекурсию используют для каких-либо вычислений, но также эти же вычисления можно реализовать с помощью цикла. Правда, в некоторых случаях(с которыми
вы, вероятнее всего, редко будете сталкиваться) удобнее использовать рекурсию за счёт её простоты реализации. Но стоит помнить, что используя рекурсию, вы рискуете
получить провал стека, который привод к падению вашего приложения.
Итог: Рекурсия - просто, но с риском. Цикл - просто, либо сложно, НО без риска получить крах всего приложения.
То есть, рекурсию можно и никогда и не использовать?
@@Литературоведы-з4у, можно, но нужно
по моему рекурсию надо удалить вообще.
@@GrishOK1993 напиши без рекурсии алгоритмы той же сортировки к примеру сложности меньше n^2 и скажи нужна она или нет
@@vitaliivynnyk9642 Спасибо)) - крутая тема на первый взгляд в сортировке, я даже не думал что за пять минут увижу так много вариантов сортировки в инете)) - буду разберется если время позволит)
дуже доступно і зрозуміло, виконала ще декілька задач згенерованих ШІ і закріпила зання.
Чётко и по делу, в общем как всегда, спасибо за видеоролик, за 10 минут изложили всю суть как это делается, а потом еще очень разжевано объяснили принцип работы, слёту лайк!!!
Чтобы понять рекурсию,нужно сначала понять рекурсию(Конфуцый)
* начал активно рекурсивно думать *
...начинаю изучать рекурсию -> чтобы ее понять, надо ее изучить -> начинаю изучать рекурсию -> чтобы ее понять, надо ее изучить...
void learnRecursive()
{
return learnRecursive();
}
@@justuser2463 почему void функция что-то возвращает?)
@@justuser2463 У Меня случилось переполнение стека в мозгу)
@@ruslandad365А надо было всего сделать условие выхода ой ой йойойоой!
Программа мозга упала полагаю!?
@@justuser2463рекурсия изучения рекурсии
Пришёл сюда из плейлиста по C#, чтобы поподробнее изучить данную тему. Очень доходчиво разъяснено. Большое спасибо!
Не пойму людей, которые ставят дизы на такие информативные и понятные видосы. Если это из-за несущественной в данной ситуации погрешности в виде 0! = 0, то таким людям не угодить. Суть видео совсем не в этом.
Скажите пожалуйста почему N сразу не умножается на (N - 1) а только потом когда все закончилось?
@@Empty_line потому что до возврата результата умножения функция Fact вызывает сама себя ещё раз. Если бы сразу произошло умножение и функция вернула его результат, то она (функция Fact) уже не вызвала бы себя и никакой рекурсии не было. После возврата результата функцией любой код, который следует строками ниже return, не будет выполняться. Можете даже попробовать с чем-нибудь простым. Напишите функцию, которая выполняет результат сложения двух чисел, а ниже (имеется в виду в теле этой же функции) ещё какой-нибудь код. Visual Studio вам даже затемнит этот код, подсказывая, что он недостижим, а потому и не выполнится. То же самое и здесь
Я не понял что ты написал,это связано со стеком?или что?
@@Empty_line посмотри, где N умножается на N-1. Причём не просто на N-1, а Fact(N - 1), т.е. функция сама себя ещё раз вызывает. Это всё происходит в return. Ты знаешь, что делает оператор return? Он завершает выполнение функции и возвращает управление вызывающей функции. Но прикол в том, что в данном случае в нём же (в return) снова вызывается эта же функция, но только с уменьшенным на единицу N. Поэтому return пока что не завершает выполнение функции и ещё не возвращает управление вызывающей функции. Сначала обязана вызваться функция Fact(N - 1). Поэтому сразу и не происходит умножения N на N-1. Если бы return проигнорировал Fact(N - 1), то функция не вызвала бы сама себя и никакой рекурсии не было бы.
@@753bc9 Спустя время я понял что к чему спасибо тебе ты всё понятно изложил😊
С первого раза не понял принцип работы стека. Со второго стало всё понятно, благодаря такому подробному объяснению. Большое спасибо.
Oдин из немногих случаев когда я получил огромное удовольствие от урока. Спасибо
Наиподробнейший разбор, которого я ни у кого не видел. Спасибо!
благодаря этому факториалу еще больше понял суть работы рекурсии. Спасибо большое
Очень интересная и в то же время сложная тема! Спасибо за ваш урок все понял вы лучший!
* Самые понятные, видео уроки по c++, на всём (RU) youtube *
Таки и алгебру выучу. Очень хорошее объяснение! Автор не поленился заморочиться с рисунками. А они помогли понять! Респект✓!
ну он тут ошибся как минимум в супер простой вещи "Факториал"
Великолепные уроки! Огромное спасибо!
Разобрал по полочкам и все прям найс!
Понимание этого на деле просто!
Ну если конечно не углубляться в тонкости работы этого всего (одного только стэка) Но щас этого более чем хватает!
чем больше смотришь видео, тем больше хочется смотреть дальше. затягивает как сериал))) у нас сейчас в компьютерной академии закончился курс ООП и начинается С#. мы всей группой надеемся что у вас скоро появятся обучающие ролики по этому языку. очень-очень ждем. спасибо за ваш труд!
Люди реально этот примитив изучают в вузах?!
@@vitusink6445 Какой примитив? А как надо? Не от простого к сложному, а сразу "Перельман"?
@@TheWladberlin Я как бы думал что в вузах посложнее задачи...
@@vitusink6445 2023 ничего не изменилось
без рекурсии
int N;
int fac=1;
cout N;
for (int i = N; i >= 1; i--)
{
fac = fac * i;
}
cout
вот то что я искал, спасибо вам огромное🤝
Вы очень хорошо объяснили такую непростую тему, с первого раза конечно дошло, но я пересмотрю еще раз для лучшего усвоения материала)
Спасибо за урок! Реально, чел, ты крут! Не только знаешь своё дело, но и умеешь объяснить другим!
Так было интересно что я слушал урок как хороший детектив:-) Спасибо Вам еще раз
У меня получилось это сделать самому, чему я очень рад, правда лишнюю переменную сделал. Спасибо вам большое за ваши уроки!)
Ха, самое интересно что благодаря 2-ум предыдущим урокам ( про стеки и рекурсии ) , я перед тем как смотреть видео
решил сам написать код , который будет искать факториал.
После потного часика все-таки написал САМ не смотрев видео!
Спасибо вам больше за труды, подача настолько понятное, что ну вообще вопросов не остается!
С меня донатик с первой ЗП, хех)
P.S
вот код кому интересно.
int FACT(int a)
{
if (a > 1)
{
a = a - 1;
return a * FACT(a);
}
else
{
return a;
}
}
int factorial(int a)
{
if (a > 1)
{
a = a * FACT(a);
}
return a;
}
int main ()
{
int a = factorial(3);
cout
Прочел комменты, и узнал что факториал 0 = 1 .
Тогда необходимо в функцию factorial добавить проверку -
if ( a == 0 )
{
return a+1;
}
Очень круто и все ясно. Спасибо вам за ваш труд. Это очень ценно!!!!
У вас классные уроки!) Все сразу становится просто и понятно)
Задонатил 100 руб в качестве благодарности за ваш труд, ваши уроки бесценны)
Спасибо Вам!)
Ваши уроки бесценны но не дороже 100 руб :)))
Матрешка
Очень хороший пример для понимания работы рекурсии
Спасибо! Хоть голова от этих факториалов и квадратная:)))
Вы лучший даже в книгах такого нет
спасибо вам за урок очень подробно обьяснили и разжевали это для нас спасибо
Факториал нуля равен единице. А при обобщении факториала гамма-функцией можно вычислить факториал отрицательных чисел.
Аналогично
Нет, факториал отрицательных целых чисел вычислять нельзя, т.к. именно в них гамма-функция имеет разрывы. А на всей оставшейся комплексной плоскости эта функция определена збс.
вычислить факториал отрицательных чисел нельзя. Гамма-функция там стремится в + или - бесконечность. Но у гамма-фунции существует аналитическое продолжение где она определена в комплексной плоскости. К стати гамма-функция существует для нецелых значений, и что интересно можно посчитать факториал дробных чисел.
гамма функция вычисляет также и дробные значения факториала.
@@ilia_meysak страшные слова, пологаю, нецензурные
Спасибо. "Разжевал" так, что даже мой кот понял )
Единственное, что вместо 2-х if использовать 1 ( сути никак не меняет)
int fact (int n)
{
if (n > 1) {
return n = n * fact(n - 1);
}
return n;
}
ОФИГИТЕЛЬНО! ГРОМАДНОЕ СПАСИБО!
Да, спасибо)
SimpleCode one love
Очередное спасибо.
Спасибо большое за урок, Сергей!
Спасибо тебе большое за твои уроки!!
Факториал числа это произведение чисел от 1 до N! включительно. 7!=1*2*3*4*5*6*7
1:49 - Что необходимо для вычисления факториала числа 2 ?
4:24 - Вычисляем факториал числа
5:06 - Формула факториала числа
5:49 - Условие выхода из цикла
6:45 - Вызов функции вычисления факториала числа
7:55 - Проверяем работу функции отладчиком
Отличные уроки, спасибо
Все гениальное просто. А вот мой вариант:
int foo(int n, int N=1)
{
N *= n*(n-1);
if (n - 1 == 1)
{
return N;
}
n-=2;
return foo(n, N);
}
Просто и доходчиво и очень наглядно, спасибо!
Лучшие уроки по с++ в ру сегменте
Оххх, спасибо! Вроде всё понял, пойду-ка напишу пару рекурсивных функций!
#факториал #рекурсия #SimpleCode #урокипрограммирования
Я только сейчас узнал что такое Факториал и как он работает , до этого вообще не знал что это такое , мне 23 ))) Спасибо!
Огромное спасибо,я начал чучуть понимать рекурсию до этого я не понимал что это)
5!=1*2*3*4*5 так в школе учили.
Спасибо, как всегда просто супер!!!
Спасибо спасибо спасииибо вам огромное!!!!Сразу понятен стал смысл рекурсии, а то препод что-то набубнил быстро-быстро такую довольно специфическую тему, и все, разбирайтесь сами😒
4 раза пересмотрел )) потом понял)) спасибо огромное!
Спасибо за ваш труд!
if(N == 0)
return 0;
Не нужно это, я без него запускаю и всё работает, ибо после слова return функция останавливается, ещё с питона знаю. А так курс чёткий, моё уважение).
Очень понятно объяснил ,спасибо автору
Практическое применение рекурсии используется при обходе древовидных структур с заранее не известным количеством ветвей. Например файловая система компьютера или парсинг xml документа.
Спасибо, очень все понятно и просто)
Я поняла! Супер пример. Спасибо!
как успехи?
@ работаю разрабом ))
Очень крутое объяснение, лайк!
Круто объяснил, всё понял, спасибо
Спасибо за уроки
Спасибо за урок.
Нашел на одном форуме может кому будет полезно: Просто всё дело в том что факториал имеет более глубокое комбинаторное значение, то есть это не просто некое произведение, а количество перестановок множества из n элементов. Например, элементы множества {A,B,C,D} можно линейно упорядочить 4!=24 способами. А вот множество из нуля элементов, имеет по определению один НУЛЕВОЙ эллемент, поэтому и перестановка там только одна. Хотя и множество из одного эллемента тоже имеет один - ненулевой эллемент, поэтому она там тоже одна. зы Я с матфака
Гениально)) я факториал сделал без проверок 0 и 1))
Минимум операций))
int fact(int x)
{
int proiz(1); int i(1);
while(i
откуда вы такие гении беретесь а?
Спасибо тебе большое!!!
Круто обьясняеш. Полудше чем лектор
Благодарю. Прекоастное
Почему умножение выполняется только потом? почему не сразу?
@@Empty_line потому что не хватает результата функции
Я сделал немного подругому, но с добавлением переменной i (итерация). У вас безусловно решение лучше) Может если бы знал про формулу, то решил бы так же. Но её я не знал и решал, так сказать, через своё понимание)
#include
using namespace std;
int fc(int i, int n = 1)
{
if (i < 1)
{
return n;
}
n *= i;
return fc (--i, n);
}
int main()
{
cout
Спасибо Большое
Спасибо большое!!!
Спасибо!
if (n < 2) return 1; Функция вызывает саму себя, до тех пор, пока аргумент не подходит под условие выхода из функции. В то время, пока функция вызывает саму себя (уменьшается значение аргумента). Как аргумент подошел к значению в условии выхода из функции - в этот момент самая глубокая функция получает возвращаемую единицу (можно считать это первой вычисленной функцией). После этого начинается обратный процесс, умножение результата функции на аргумент, который постепенно увеличивается (до начального значения).
Без рекурсии:
int Fact(int N)
{
int result = 1;
for (int i = 1; i < N; i++)
{
result *= i;
}
return result;
}
cout
Ниче не хочу сказать, но вы кавычки потеряли...
Да и setlocale неплохо бы прописать, чтоб вместо букв краказябры не выдало😄😅
Так как мы хорошие студенты, после рекурсии сам для себя вычислил факториал через for:
int Fact(int N) {
int fact=1;
for (int i = 1; i
А работает?
Для матеши пригодится :D факториалы вычислять
Мой мозг, окочательно сломан....
просто математическое толкование факториала здесь дано сильно криво. n! = 1*2*3*.....*n
@@loading99error.55 Не криво, а математически точно.
Спасибо за урок, и объяснение алгоритма!
Вопрос для моего понимания при попытке вычислить факторил числа больше 17, мы получаем отрицательное значение. Насколько я понимаю это связано с типом используемой переменной int которая не может поместить данное значение?
Какой самый большой тип хранения целых чисел мы можем использовать ?
cout
Это переполнение данных. unsigned long long int максимальный тип для целых беззнаковых чисел. Если нужно ещё больше то уже нужно смотреть в сторону библиотек с реализацией чего - то типа BigInteger. У меня такой необходимости не возникало, так что более точно не скажу.
#SimpleCode спасибо
N! = 1*2*3* ... *(N-1)*N по определению, а 0! = 1 просто по соглашению, так как это помогает записывать в общем виде некоторые выражения, не оговаривая отдельно нулевой случай(например, биномиальные коэффициенты или количество выборок из n по k)
с высшей математики должно быть известно что факториал вычисляется через Гамма-функцию и Г(0)=1
Это гениально
Приведу пример рекурсии:
Решение лабиринта: Лабиринт можно представить в виде сетки клеток, где одни клетки заблокированы, а другие открыты. Для исследования лабиринта можно использовать рекурсивную функцию, пытаясь найти путь от начальной точки до конечной.
пока кто то на это вливает большие деньги, мы смотрим бесплатно)))
спасибо
Для тех кто не понял объясняю вкратце суть всех трех уроков:
1) `Рекурсия` разбивается на задачи и записывается в стэк (очередь), задачи выполняются последовательно сверху вниз и работают по правилу: `последним зашел, первым вышел`.
2) Факториал числа - это произведение натуральных чисел от 1 до самого числа (включая данное число). Обозначается факториал восклицательным знаком «!».
пример: 3! = 1 · 2 · 3 = 6
3) Принцип работы: сначала записываются данные из выражения рекурсии (N = 5 - 1), потом происходит последовательный вызов и выполнение возвращаемого значения рекурсии сверху вниз:
```
(return 2 * (2 - 1)) * (return 3) * (return 4) * (return 5) = 120)
```
Скажите пожалуйста почему N сразу не умножается на (N - 1) а только потом когда все закончилось?
Это происходит потому что рекурсия следует стеку? как вы говорили
@@Empty_line функция принимает аргумент, который записывается
@@argabid5897 сложно
@@Empty_line немного абстрагируйтесь от реализации и тогда все станет ясно
Вот, как посчитать факториал больших чисел, например, 1000! считается хорошо:
#include
using namespace std;
int main()
{
int N, i, k, p, carry, Num_Digits;
int Big_Factorial[750]; // Вводим массив с 750 элементами, у каждого из которых будет не более 4 цифр, таким образом всего в массив вмещается 3000 цифр, чего наверняка хватит для расчета факториала 1000! и меньше
cout > N)) // Проверяем, не являются ли введенные символы буквами (защита от дурака)
{
cout 1000)
{
cout
Автор молодец, объясняет доходчиво! Это лучшее объяснение из всех, что я видел! Но у меня складывается мнение, что лучше избегать рекурсий или заменять их на циклы, потому как с ними один большой геморрой: то у рекурсий постоянно stackoverflow, то сам механизм рекурсии очень сложен. пока автор объясняет, вроде бы понятно, как только самому что-нибудь сделать надо, то делаю методом тыка. Вот так-то!!! Интересно, можно ли в программировании совсем обойтись без рекурсии?
Попытался сделать сам перед началом видео, вышло так, вроде работает
int rez = 1;
int fact(int a)
{
if (a == 1 || a==0)
return rez;
rez *= a;
a - - ;
return fact(a);
}
void main()
{
setlocale(LC_ALL, "rus");
fact(5);
cout
Что такое факториал - помню с вуза, поэтому решил попробовать организовать его вычисление до просмотра этого урока. Саму формулу нахождения факториала Н!=Н*(Н-1)! разумеется уже не помнил, но посидев подумав, и следуя от обратного, что Н!=1*2*3*..*Н у меня в итоге в программе вышла та же формула нахождения факториала, только "вывернутая", :) Вот моя функция:
int factorial(int a) {
if (a == 1)
return a;
a--;
return factorial(a)*(a+1);
}
По-моему, где-то else не хватает🤔🤔🤔
вовсе не сложно братишка спасибо тебе
Int a;
Cin
ххапххпаа это да.
Видимо код ты писал на скорую руку и не в vs code. У тебя неверный код, он не сработает как надо, тк как ты в параметре цикла сделал дикремент i, а внутри самого цикла увеличил, то есть сначала он увеличит на 1, а потом уменьшит когда цикл сработает 1 раз. Иначе говоря переменная i так и останется 1.
Вот более верный код:
int N = 5;
if (N == 0)
{
std::cout
суть ролика - показать как работает рекурсия, а у вас минимум 3 ошибки в коде и 1 неточность.
3 ошибки:
1. нет объявления Count - int Count
2. нет объявления i в цикле for - for ( *int* i = 1; i > a;
for (a; a > 0; a--)
{
count *= a;
}
cout
@@laim3756 Спасибо, что поправили. Я стараюсь больше таких глупостей не писать. Коль скоро Вы соображаете в Сях, то можно ли заменить весь цикл for на
while (a - -)
count *= a;
Посидел, подумал. Наверное, надо тогда магическое число добавить
int a;
cin >> a + 1;
Иначе факториал до предыдущего числа посчитает.
Аааа, спасибо!
Я как раз не могла эту тему понять, а тут всё очень чётко объяснено!
А почему ты используешь void main, а не int main, как обычно делают?
он не чего не возвращает. По этому и нет надобности в int
Прикольно
Доброго дня. Пробовала разные значения присваивать функции Fact(). Начиная с 20 выводятся отрицательные значения. Почему так?
UPD: Все, разобралась. Слишком большое число получается. С long long все работает хорошо)
Факториал например 5! = 5*4*3*2*1 = 120, так же намного проще, чем 5!= (4-1)! нет? Спасибо огромное за ваши уроки)
Лучший)