i know im asking randomly but does anyone know of a way to log back into an instagram account..? I somehow lost my account password. I appreciate any assistance you can offer me
Спасибо огромное, что начал еще и этот курс, я и не надеялся, что после андроида и EE останутся силы на алгоритмы) Очень жду уроков по всем курсам, ужасно благодарен за труд)
Все уроки отличные. Пересмотрел все уроки канала. Подход уроков просто шикарный. До этого смотрел много уроков, но всегда оставалось чувство неполноты. После уроков автора все стало на свои места. Очень благодарен автору за огромный труд. Ты №1.
Когда вы стали в начале видео говорить о том, что первый способ примитивный и банальный и самый такой который в первую очередь приходит в голову, то я ожидал услышать именно этот вариант, который вы показали вторым, мне бы никогда в голову не пришло бы вычислять число Фибоначчи каким-то другим способом, а уж тем более рекурсивным... Я ожидал услышать какою-то мега крутой и секретную формулу (алгоритм), а оказалось все так просто и банально.... Это как взять поставить стакан с водой перед человеком и сказать выпей его и он бы взял трубочку стал использовать и затратил бы большее количество времени, чем если бы просто взял в руку и в пару гладков выпил бы её)) Видео отличное, но концовка неожиданная ))
Что сказать, Вадим, вы красавчик, вы крутой, вы ахуенный, а вот я подумал в первую очередь про рекурсивное решение. Я даже не думал, что это настолько плохо и не задумывался над тем, что этот алгоритм совершает много дубликатов в своих вычислениях. Понимаете кто то рождается с пониманием того что можно сделать глоток воды без трубочки, а кто то пъёт из трубочки, потому что другого не знает
Думал смотреть курс от индийского мужчины, но он первые 5-10 видосов обьясняет что то, а Вы сразу пишете код, что по моему намного лучше. Вы без лишних слов, а просто десятком строчек кода заинтересовали меня в том, что нужно посмотретоь весь плейлист. Я когда увидел разницу во времени экзекуции метода, я просто охуел. Спасибо
число 1 000 000 000: твой алгоритм с массивами выполняется 23-31 сек, а если использовать три переменные - 3-5 сек) ```go var d int _, _ = fmt.Scanf("%d", &d) var a int64 = 0 var b int64 = 1 var c int64 = 0 for i:= 0; i < d; i++ { c = b b += a a = c } fmt.Println(a) ``` при 10 000 000 000 вариант с переменными выполнился за 13.233214662s твои массивы заполнили всю оперативную память (8гб) и 15гб памяти на ssd: Process finished with exit code 137 (interrupted by signal 9: SIGKILL) пам-пам! вот она сила алгоритмов на практике))
Я вот чёт тоже думал про переменные, а не массивы.. но, тем не менее, надо смотреть на логичность задачи. Кому понадобится 10 000 000 000 элемент чисел фибаначи?) BTW, такое число в лонг не запихать. БигИнт надо какой то.... Но опять же - где логика таких задач?)
боюсь твой вопрос в корне неправильный. мы здесь вроде как примеры реализаций рассматриваем, а не логичность задач. данная реализация например говорит нам о том, что если нет необходимости хранить ненужные данные, лучше их не хранить.
Спору нет, хранить может и не стоит... но вопрос всё ж логически постановке задачи. Почему ты тогда не протестировал поиск гуголплексового значения?) Всё ж это больше выглядит, как - некчему докопаться, докопись до орфографии. Тут рассматривается ВАРИАНТЫ решения алгоритмов, а не единственное возможное. Вариант с хранением данных может пригодится в том случае, если мы постоянно будем числа искать - простая модификация и никаких вычислений в будущем.
inp, array = int(input()), [0,1] for i in range(1, inp): array.append(array[i] + array[i-1]) print(array) ------------------------------- Как это выглядит на питоне с использованием списка в 3 строки) Базару нет, можно и с переменными, но все зависит от поставленных задач (тобишь от диапазона чисел). Да и видео вроде как называется не "самый эффективный алгоритм для решения задачи чисел Фибоначчи", если вы читали название:) Здесь PoC обьясняется и ради этого я сюда зашел как бы, алгоритм я для себя напишу и подберу уже сам. Темболее что это и логично, потому что ты хранишь все возможные числа до N в одном типе данных, по этому оно так оперативу и хавает, лол. Или может на ассемблере перепишем раз на то пошло? :D
Простой и понятный пример. Алгоритм можно ещё больше оптимизировать. Недавно в универе дали задание найти n-ое число Фибоначчи за время O(log n). А это уже бинарное возведение в степень и матрицы)
@@MsDima9999 my function just shows some apprach for sum and as u see I wrote return sum or b which means I didnt tested that. The only info from my code u need to take it is using 3 vars
Спасибо большое! Очень интересно и доступно и отдельное спасибо за 1440p60! Очень жаль что на Udemy всего 720р... И подумайте о том, что бы прикрутить к своим видео тут какую-то донат-платформу. Думаю многие бы благодарили, каждый в меру своих возможностей.
Написал данный алгоритм (Effective) на swift, использовал Decimal в качестве типа данных, при n = 100 получил число 354224848179261915075. Это число отличается от результата на видео. Попробовал в инете онлайн калькулятор числа Фибоначи - результат был как в моей проге. Похоже с long такие вычисления не катят.
Подскажите,а в какой последовательности правильнее смотреть ваши курсы? Например, Джава для начинающих,потом Алгоритмы и структуры,потом Продвинутая Джава,а потом уже к примеру Спринг.
Спасибо за урок! Подскажите, пожалуйста, как настроить Idea так, чтобы вверху над рабочей областью высвечивалось имя метода, в котором находится курсор, как у Вас в этом видео?
Можно же выполнить задачу и без массива используя три переменных и перезаписывавать их. Так мы не сохраняем последовательность чисел посчитанных но по идее памяти меньше будет использовано та и запоминать последовательность и не нужно
Согласен. Нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет. Но автор, в любом случае, молодец.
The 100th Fibonacci number is 354,224,848,179,261,915,075. Since 100 is relatively large, it would take quite a bit of time and calculation to find the 100th Fibonacci number using our recursive formula. не помещается 100е число в лонг. если весь массив напечатать то видно что под конец вылазят отрицательные числа. наверно бигИнт нужно прикрутить но их складывать плюсом не выйдет
Здравствуйте! Шикардос! Почему этот алгоритм не рассказывают, в учебниках? Рекурсия-рекурсией, но надо (имхо), сразу давать понятия об алгоритмах и вычислении их эффективности. Может, я не те книжки читал. Самоучка, если что.
А если написать следующий код(на js), он сделан с рекрсией, но вычисляет так же быстро let a = 0, b = 1, c = 0, k = 1; function fibonachi(n) { c = a + b; k++; a = b; b = c; if(k == n) { console.log(c) } else { fibonachi(n); } } fibonachi(1300)
Наиль, спасибо огромное! Замечательные курсы! Только возник вопрос. Сотое число не помещается в long, помоему. Попробовал long и BigInt, получился разный результат.
Я тоже так сначала решил, до того как видео посмотрел. Просто переопределял x и y на каждой итерации и вычислял их сумму. Ну, думаю, этот способ явно "тупой", так как сразу в голову приходит, посмотрю ка я в видео что же там за умный способ показан, рекурсия наверное. А оказалось всё как раз наоборот.
Подскажите пожалуйста, в каком порядке нужно проходить курсы, размещенные у автора на канале? В плейлистах порядок курсов такой: 1. Java для начинающих 2. Android для начинающих 3. Java EE для начинающих 4. Алгоритмы и Структуры Данных 5. Spring Framework 6. Git Полный курс Но я не уверен, что проходить изучение будет правильно именно в таком порядке. Может кто-то знает с высоты собственного опыта?
Как же не используется память при рекурсивном варианте если все равно же стек очень сильно забиваеться, а стек это же структура данных - то что хранит данные в памяти
Здравствуйте, начал осваивать IT с нуля, стараюсь освоить базис (до банального пересматриваю краткий курс информатики 10-11класс), начал с Вашей помощью учить python, понимаю, что нужны алгоритмы, но в первом же видео, вы пишете код на неизвестном мне языке. Хочу параллельно эти дисциплины проходить. Как быть? Нужно сначала бросить python и выучить другой язык? Вопросы может глупые, но все, я думаю, были на моей стадии ;)
Не обязательно помнить весь массив чисел Фибоначи, достаточно последних 2-х. В таком случае мы добьемся решения задачи за линейное время и константную память
Только хотел написать то же самое. Нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет. А если делать так, как сделал автор - то при необходимости вычислить какое-нибудь огромное число Фибоначчи - просто памяти не хватит, и будет краш или типа того. Но в любом случае, видео очень полезное, спасибо большое автору!
Не сказал бы, что первый алгоритм более очевидный и наивный, я почему-то сразу подумал именно про второй, был уверен, что он и будет наивным. Интересно было узнать, каким будет продвинутый в таком случае))) Еще вопрос - а что эффективнее с точки зрения скорости и памяти - хранить в массиве все числа или перезаписывать промежуточные результаты в переменных?
На самом деле, нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет.
Мне искреннее интересно, как Наиль посчитал время вычисления 100-го числа Фибоначчи первым методом? Я забивал в код 50-е число и оно посчиталось довольно оперативно - 43 секунды. Кстати, используйте BigInteger вместо long для правильного расчёта например 100-го числа Фибоначчи и не забывайте про метод сложения - add и valueOf(n).
Я не совсем понял зачем массив? Почему нельзя 2 переменные постоянно переопределять? Возможно по производительности ничего не изменилось бы, но по памяти всяко быстрее
Тут что-то не так. В 64 битах 20 порядков в десятичном представлении -- у вас 19. В rust мне не удалось 100-е число Фибоначчи вычислить -- упёрся в ограничения unsigned int 64 (в отладочной сборке rust это проверяет). Да, действительно, там переполнение. Пора переезжать на 128 бит)) P.S. Запустил без проверок на переполнение -- результат как у вас стал. Починил!))
Потому что нам надо найти все числа Фибоначчи от 0 до n, где n - аргумент метода. От 0 до n как раз n + 1 чисел Фибоначчи. Например, пользователь вводит 3. От 0 до n - [0,1,2,3] - 4 (n+1) числа Фибоначчи.
А зачем собственно тратить память на массив, если на выходе у нас только n число, при том что для расчетов нужны только n-1 и n-2, а не вся числовая последовательность, не будет ли более эффективным такой код: long n1=1; long n2=0; long r=0; for (int i=2;i!=n;i++){ r=n1+n2; n2=n1; n1=r; } return r;
То чувство, когда абсолютно не понял как работает "наивный" метод, но если бы нужно было реализовать данную конструкцию, то я бы думал в направлении "эффективного" способа - даже не знаю, хорошо или плохо это)))
видео как всегда супер, однозначно лайк. но у меня есть вопрос по fibNaive (11:09). никак не могу понять, почему return fibNaive(n - 1) + fibNaive(n-2); не равен return (n - 1) + (n - 2);. буду очень признателен, если у кого-то появится желание ответить.
Может потому что "return fibNaive(n-1) + fibNaive(n-2)" - это рекурсивный вызов? т.е. зайдя в этот метод с неким n > 1, возвратным значением будет снова вызов этого же метода с новым n (один вызов будет n-1, другой n-2, которые в свою очередь о5 вызовут методы). Соответственно результат будет "комом" нарастать. А return (n - 1) + (n - 2) просто вернёт значение, произведя математическое действие. Передав методу параметр 5, он вернёт 7
Потому что рекурсии в твоем примере (n - 1) + (n - 2) нет. Ответ будет не верным. А алгоритм для вычисления рекуррентный, поэтому без рекурсии никак. Запись вида fibNative(n - 1) + fibNative(n + 2) рекурсивна, функция вызывает саму себя дважды, рекомендую почитать про рекурсию если не понятно все равно.
Что скажете по поводу моей реализации метода получения числа Фибоначчи? class Fibbonacci{ static final int n0 = 0; static final int n1 = 1; static long toGetNumber(int n){ if (n < 2) return n; else{ long sum2 = n0, sum1 = n1; for(long x = 2; x
Тот случай, когда умники сами себя перемудрили. Я бы сразу начал решать путём последовательного складывания чисел, а не по "мудрой" и красивой математической формуле. Пытался как-то составить программу по нахождению простых чисел, чуть не поседел, переводя математическое описание в код! Оказалось, такое число должно делиться без остатка только на само себя и всё!
да он с книги все берет) случаино книгу увидел и там то же глава начинается с фибоначи, но там понятнее показано. ведать все его курсы так и сделаны из книг со своей интерпритации. Причем он сложность алгоритма так и не показал как считать)
Я так и не понял, чесло 0 считать или нет? Если считать, то 5 - получается шестым числом, или 0 - это нулевое число Фибоначи? :) З.Ы. Спасибо за видео!!!
Спасибо за восхитительные уроки! (Кстати именно при Fn92 он уже переполняется -> 7540113804746346429). Но уроки и правда хорошие. Как досмотрю ютуб - подпишусь на новый курс.
Заебись, а то что 100-ый элемент нельзя через long посчитать, то похер)))) Число 100-го элемента считается через BigInteger и оно будет немного больше...
Очень странный пример. Я всегда считал, что "наивный способ" это как раз такой, когда ты программно воссоздаешь ручной способ проделывания операций. А знание алгоритмов нужно, чтобы сделать все гораздо эффективнее неочевидным способом. Но на видео как раз обратная ситуация. Я специально написал свое решение (с 3-мя переменными, без массива) перед тем, как было показано "наивное" и сильно удивился, когда узнал, что оно было оптимальным. У меня вопрос: зачем изучать алгоритмы, если можно представить ручной способ, а потом просто запрограммировать его?
КУРС ПО GIT: www.udemy.com/course/git-alishev/?referralCode=71994763964B8E2E6A4E
i know im asking randomly but does anyone know of a way to log back into an instagram account..?
I somehow lost my account password. I appreciate any assistance you can offer me
Спасибо огромное, что начал еще и этот курс, я и не надеялся, что после андроида и EE останутся силы на алгоритмы)
Очень жду уроков по всем курсам, ужасно благодарен за труд)
И я также:)
Только не смей перестать!
Все уроки отличные. Пересмотрел все уроки канала. Подход уроков просто шикарный. До этого смотрел много уроков, но всегда оставалось чувство неполноты. После уроков автора все стало на свои места. Очень благодарен автору за огромный труд. Ты №1.
Боже, это то что я так долго искал. alishev спасибо тебе огромное, продолжай снимать такой же качественный контент.
прям идеальное дополнение к книге "Грокаем алгоритмы"! Спасибо !
Спасибо за Вашу работу!!!
Когда вы стали в начале видео говорить о том, что первый способ примитивный и банальный и самый такой который в первую очередь приходит в голову, то я ожидал услышать именно этот вариант, который вы показали вторым, мне бы никогда в голову не пришло бы вычислять число Фибоначчи каким-то другим способом, а уж тем более рекурсивным... Я ожидал услышать какою-то мега крутой и секретную формулу (алгоритм), а оказалось все так просто и банально.... Это как взять поставить стакан с водой перед человеком и сказать выпей его и он бы взял трубочку стал использовать и затратил бы большее количество времени, чем если бы просто взял в руку и в пару гладков выпил бы её)) Видео отличное, но концовка неожиданная ))
Что сказать, Вадим, вы красавчик, вы крутой, вы ахуенный, а вот я подумал в первую очередь про рекурсивное решение. Я даже не думал, что это настолько плохо и не задумывался над тем, что этот алгоритм совершает много дубликатов в своих вычислениях. Понимаете кто то рождается с пониманием того что можно сделать глоток воды без трубочки, а кто то пъёт из трубочки, потому что другого не знает
Наиль, ты лучший! Спасибо тебе что ты есть!
Второе решение которое вы продемонстрировали выглядит очень простым по сравнению с первым , по крайней мере для восприятия . Спасибо за видео !
очень хорошо объясняется, всё понятно, просмотрел все java курсы и купил новые на udemy, спасибо
Спасибо большое. Именно, с Фибоначчи я начинала изучение алгоритмов. Ваше видео было чУдным дополнением к моим знаниям
Доброе время суток, большое спасибо за урок!
Более подробного и доступного объяснения я не нашел нигде!
Спасибо тебе автор. Вкатываюсь в бэк с фронта и ты очень помогаешь.
Наиль Спасибо вам огромное, все очень понятно объясняете, одно удовольствие изучать АиСД по вашим урокам)
спасибо человечище!
Огромное спасибо за такой полезный материал, с нетерпением ждем продолжения. Очень важная тема.
Спасибо за алгоритмы, надеюсь выйдет больше видео на эти темы :)
Отличная подача материала! Спасибо большое.
Здравствуйте. Спасибо большое за уроки.
Отлично! Очень ждал материал именно по алгоритмам. Спасибо большое!
Вот ещё вариант:
private static long fibEffective2(int n) {
if (n
О, я как раз задал вопрос "зачем массив в плане памяти, 2*long против n*long" и уведел ваш комментарий 👍
@@TezkaTszyu +
тоже самое, но без массива. В массиве хранить данные удобнее, согласитесь
Отличный урок! Спасибо огромное! Очень понятно объясняете.
Думал смотреть курс от индийского мужчины, но он первые 5-10 видосов обьясняет что то, а Вы сразу пишете код, что по моему намного лучше. Вы без лишних слов, а просто десятком строчек кода заинтересовали меня в том, что нужно посмотретоь весь плейлист. Я когда увидел разницу во времени экзекуции метода, я просто охуел. Спасибо
число 1 000 000 000:
твой алгоритм с массивами выполняется 23-31 сек,
а если использовать три переменные - 3-5 сек)
```go
var d int
_, _ = fmt.Scanf("%d", &d)
var a int64 = 0
var b int64 = 1
var c int64 = 0
for i:= 0; i < d; i++ {
c = b
b += a
a = c
}
fmt.Println(a)
```
при 10 000 000 000
вариант с переменными выполнился за 13.233214662s
твои массивы заполнили всю оперативную память (8гб) и 15гб памяти на ssd:
Process finished with exit code 137 (interrupted by signal 9: SIGKILL) пам-пам!
вот она сила алгоритмов на практике))
Я вот чёт тоже думал про переменные, а не массивы.. но, тем не менее, надо смотреть на логичность задачи. Кому понадобится 10 000 000 000 элемент чисел фибаначи?)
BTW, такое число в лонг не запихать. БигИнт надо какой то.... Но опять же - где логика таких задач?)
боюсь твой вопрос в корне неправильный. мы здесь вроде как примеры реализаций рассматриваем, а не логичность задач. данная реализация например говорит нам о том, что если нет необходимости хранить ненужные данные, лучше их не хранить.
Спору нет, хранить может и не стоит... но вопрос всё ж логически постановке задачи.
Почему ты тогда не протестировал поиск гуголплексового значения?)
Всё ж это больше выглядит, как - некчему докопаться, докопись до орфографии.
Тут рассматривается ВАРИАНТЫ решения алгоритмов, а не единственное возможное.
Вариант с хранением данных может пригодится в том случае, если мы постоянно будем числа искать - простая модификация и никаких вычислений в будущем.
бл, в шоке от твоего говнокода. Логика норм. Но названия. Блевануть мля.
inp, array = int(input()), [0,1]
for i in range(1, inp): array.append(array[i] + array[i-1])
print(array)
-------------------------------
Как это выглядит на питоне с использованием списка в 3 строки) Базару нет, можно и с переменными, но все зависит от поставленных задач (тобишь от диапазона чисел). Да и видео вроде как называется не "самый эффективный алгоритм для решения задачи чисел Фибоначчи", если вы читали название:) Здесь PoC обьясняется и ради этого я сюда зашел как бы, алгоритм я для себя напишу и подберу уже сам. Темболее что это и логично, потому что ты хранишь все возможные числа до N в одном типе данных, по этому оно так оперативу и хавает, лол. Или может на ассемблере перепишем раз на то пошло? :D
Спасибо за видео, очень доступно
Простой и понятный пример. Алгоритм можно ещё больше оптимизировать. Недавно в универе дали задание найти n-ое число Фибоначчи за время O(log n). А это уже бинарное возведение в степень и матрицы)
Наиль, спасибо большое, ждал)
"Тип int у нас перекрутился несколько раз..." - улыбнуло) Спасибо за прекрасные уроки!
private static long fibEffective(int N) {
long a = 0;
long b = 1;
long sum = 0;
for (int i = 0; i
maby i dont ubderstend something but if I put 10 in this method it returns 144 but not 55
What is wrong?
@@MsDima9999 my function just shows some apprach for sum and as u see I wrote return sum or b which means I didnt tested that. The only info from my code u need to take it is using 3 vars
your algorithm is good, but it will return a number that will be 2 numbers from the desired one, because the loop starts at 0.
Спасибо за видео!
По поводу затрат памяти, я бы в массиве хранил только предыдущие 2 числа
Можно делать это и без массива, переменными
Спасибо большое! Очень интересно и доступно и отдельное спасибо за 1440p60! Очень жаль что на Udemy всего 720р...
И подумайте о том, что бы прикрутить к своим видео тут какую-то донат-платформу. Думаю многие бы благодарили, каждый в меру своих возможностей.
как всегда, все доходчиво и интересно
спасибо за урок!
Благодарю, хорошо объяснил.
Решение без массива вообще
static int fib(int n)
{
int a = 0;
int b = 1;
int result=n;
for (int i = 2; i
Шикарный урок
Привет друг, ты супер полезную работу делаешь, однако, на данном этапе, я хочу тебе сказать что фибоначчи 100 не влезает в long ((2^64) -1)
Спасибо! Очень понятно!
Спасибо отличное видео, жду ещё!! )))
Написал данный алгоритм (Effective) на swift, использовал Decimal в качестве типа данных, при n = 100 получил число 354224848179261915075. Это число отличается от результата на видео. Попробовал в инете онлайн калькулятор числа Фибоначи - результат был как в моей проге. Похоже с long такие вычисления не катят.
Подскажите,а в какой последовательности правильнее смотреть ваши курсы? Например, Джава для начинающих,потом Алгоритмы и структуры,потом Продвинутая Джава,а потом уже к примеру Спринг.
Давайте полный курс по Алгоритмам и структур данных для начинающих на udemy
Курс купила по яве🤗👌😍
Это гениально
Спасибо за урок! Подскажите, пожалуйста, как настроить Idea так, чтобы вверху над рабочей областью высвечивалось имя метода, в котором находится курсор, как у Вас в этом видео?
А зачем массив, если можно 2 предыдущих значения хранить в 2х переменных и в результате выдавать сумму? Ну в плане памяти 2*long против n*long
Можно же выполнить задачу и без массива используя три переменных и перезаписывавать их. Так мы не сохраняем последовательность чисел посчитанных но по идее памяти меньше будет использовано та и запоминать последовательность и не нужно
Согласен. Нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет. Но автор, в любом случае, молодец.
The 100th Fibonacci number is 354,224,848,179,261,915,075. Since 100 is relatively large, it would take quite a bit of time and calculation to find the 100th Fibonacci number using our recursive formula. не помещается 100е число в лонг. если весь массив напечатать то видно что под конец вылазят отрицательные числа. наверно бигИнт нужно прикрутить но их складывать плюсом не выйдет
Здравствуйте! Шикардос! Почему этот алгоритм не рассказывают, в учебниках? Рекурсия-рекурсией, но надо (имхо), сразу давать понятия об алгоритмах и вычислении их эффективности. Может, я не те книжки читал. Самоучка, если что.
А если написать следующий код(на js), он сделан с рекрсией, но вычисляет так же быстро
let a = 0,
b = 1,
c = 0,
k = 1;
function fibonachi(n) {
c = a + b;
k++;
a = b;
b = c;
if(k == n) {
console.log(c)
} else {
fibonachi(n);
}
}
fibonachi(1300)
Наиль, спасибо огромное! Замечательные курсы! Только возник вопрос. Сотое число не помещается в long, помоему. Попробовал long и BigInt, получился разный результат.
спасибо, ну я решала эту задачу и без масива, для чего хранить в массиве если просто переопределив a1, a2 задача решается?
да, можно без массива.
Я тоже так сначала решил, до того как видео посмотрел. Просто переопределял x и y на каждой итерации и вычислял их сумму. Ну, думаю, этот способ явно "тупой", так как сразу в голову приходит, посмотрю ка я в видео что же там за умный способ показан, рекурсия наверное. А оказалось всё как раз наоборот.
АиСД, вот за это отдельная спсаааа
Спасибо за уроки. а почему когда в аргумент передаем 0 то скидывает ошибку ?ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1.
ШикарнО:)
Подскажите пожалуйста, в каком порядке нужно проходить курсы, размещенные у автора на канале?
В плейлистах порядок курсов такой:
1. Java для начинающих
2. Android для начинающих
3. Java EE для начинающих
4. Алгоритмы и Структуры Данных
5. Spring Framework
6. Git Полный курс
Но я не уверен, что проходить изучение будет правильно именно в таком порядке. Может кто-то знает с высоты собственного опыта?
Спасибо, мог бы тот же пример продемонстрировать через рекурсию но с кэшированием, тогда бы вопросов в конце не возникло
Возможно в наивном алгоритме было бы уместнее сначала вычислить все числа до N, но это правда уже эффективный алгоритм получился бы)).
Сделай видео о дереаьях и графах, пожайлуста
😊😊😊
Как же не используется память при рекурсивном варианте если все равно же стек очень сильно забиваеться, а стек это же структура данных - то что хранит данные в памяти
Здравствуйте, начал осваивать IT с нуля, стараюсь освоить базис (до банального пересматриваю краткий курс информатики 10-11класс), начал с Вашей помощью учить python, понимаю, что нужны алгоритмы, но в первом же видео, вы пишете код на неизвестном мне языке. Хочу параллельно эти дисциплины проходить. Как быть? Нужно сначала бросить python и выучить другой язык? Вопросы может глупые, но все, я думаю, были на моей стадии ;)
продолжай учить, просто слушай суть. в пайтоне тоже наверняка есть циклы, рекурсия, массивы и примитивы)
Не совсем понял рекурсивный метод. Можно по подробнее? Спасибо
wow!!! SUPER
А почему при использовании наивного алгоритма не возникает ошибка - стек овер флоу?
Не обязательно помнить весь массив чисел Фибоначи, достаточно последних 2-х. В таком случае мы добьемся решения задачи за линейное время и константную память
Только хотел написать то же самое. Нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет.
А если делать так, как сделал автор - то при необходимости вычислить какое-нибудь огромное число Фибоначчи - просто памяти не хватит, и будет краш или типа того.
Но в любом случае, видео очень полезное, спасибо большое автору!
Не сказал бы, что первый алгоритм более очевидный и наивный, я почему-то сразу подумал именно про второй, был уверен, что он и будет наивным. Интересно было узнать, каким будет продвинутый в таком случае)))
Еще вопрос - а что эффективнее с точки зрения скорости и памяти - хранить в массиве все числа или перезаписывать промежуточные результаты в переменных?
На самом деле, нам достаточно выделить память лишь под массив из 3-х элементов, а не n+1. arr[0] - это будет F-2, arr[1] - это будет F-1, arr[2] - будет само число Фибоначчи. И в конце каждой итерации надо будет копировать значение arr[1] в arr[0], а значение arr[2] в arr[1]. И снова вычислять число Фибоначчии, т.е. arr[2] на основании этих двух значений (arr[0] и arr[1]). И тогда память также тратиться не будет.
А почему тело цикла for не в фигурных скобках? Не понимаю. По идее ведь должно ошибку выдать.
Мне искреннее интересно, как Наиль посчитал время вычисления 100-го числа Фибоначчи первым методом? Я забивал в код 50-е число и оно посчиталось довольно оперативно - 43 секунды.
Кстати, используйте BigInteger вместо long для правильного расчёта например 100-го числа Фибоначчи и не забывайте про метод сложения - add и valueOf(n).
возведи 43 секунды в 50 степень и удивишься
Скажите пожалуйста, как реализовать на python Фибоначчи именно списком?
Я не совсем понял зачем массив? Почему нельзя 2 переменные постоянно переопределять? Возможно по производительности ничего не изменилось бы, но по памяти всяко быстрее
11 -14 строку можно уместить в одну строку через тернарный оператор java.
Здравствуйте, это демо или полный курс?
мне кажется допущена ошибка в 5:10 , в слайде. F100 = 3736710778780434371, а так то спасибо огромное!
спасибо
Тут что-то не так. В 64 битах 20 порядков в десятичном представлении -- у вас 19.
В rust мне не удалось 100-е число Фибоначчи вычислить -- упёрся в ограничения unsigned int 64 (в отладочной сборке rust это проверяет).
Да, действительно, там переполнение. Пора переезжать на 128 бит))
P.S. Запустил без проверок на переполнение -- результат как у вас стал. Починил!))
Спасибо! А почему массив брали размером n+1, а не n ? Зачем тут на один размер вперед место еще резервировать?
Потому что нам надо найти все числа Фибоначчи от 0 до n, где n - аргумент метода.
От 0 до n как раз n + 1 чисел Фибоначчи.
Например, пользователь вводит 3.
От 0 до n - [0,1,2,3] - 4 (n+1) числа Фибоначчи.
Блин, нифига не понял.
В массиве
long a = new long[n]
при обращении a[n] будет ошибка ArrayIndexOutOfBound, потому что нумерация элементов в массивах начинается с 0.
прошу вас, продолжайте эту тему с алгоритмами..
На следующей неделе.
Объясните пожалуйста, почему длинна массива n+1?
Потому что первый элемент в массиве заполняется нулём
Ареально вообще понять и выучить эти алгоритмы если уже под сорокет а за плечами ток технарь и то непомню уже.
Разве у первого алгоритма сложность не 2^N , а у второго N? И именно в этом основная проблема
Коммент поддержки
кролики не только ценный мех!
А зачем собственно тратить память на массив, если на выходе у нас только n число, при том что для расчетов нужны только n-1 и n-2, а не вся числовая последовательность, не будет ли более эффективным такой код:
long n1=1;
long n2=0;
long r=0;
for (int i=2;i!=n;i++){
r=n1+n2;
n2=n1;
n1=r;
}
return r;
да, вы правы. ваш код еще лучше.
а ты пробовал этот код запустить и сравнить результат, например с он-лайн калькуляторами?
нужно заменить i !=n этим i
Более эффективный вариант
public long getFib(int n) {
long ar [] = new long[] {0,1};
for (int i = 2; i
То чувство, когда абсолютно не понял как работает "наивный" метод, но если бы нужно было реализовать данную конструкцию, то я бы думал в направлении "эффективного" способа - даже не знаю, хорошо или плохо это)))
Мне кажется все так думали, потому что "наивный метод" намного сложнее, там логика извращенная какая-то
если ты не понял рекурсию то еще придет время и будешь ее пытаться понять
@@kek_pupold да там же школьная формула, вы чего.
@@dragulaxis я даже не помню про что я писал, нашел когда ответить )
Посмотрел 6 минут ролика и всё понял, написал прогу с ArrayList, так как F(100) не вмещается в long.
видео как всегда супер, однозначно лайк. но у меня есть вопрос по fibNaive (11:09). никак не могу понять, почему return fibNaive(n - 1) + fibNaive(n-2); не равен return (n - 1) + (n - 2);. буду очень признателен, если у кого-то появится желание ответить.
Может потому что "return fibNaive(n-1) + fibNaive(n-2)" - это рекурсивный вызов? т.е. зайдя в этот метод с неким n > 1, возвратным значением будет снова вызов этого же метода с новым n (один вызов будет n-1, другой n-2, которые в свою очередь о5 вызовут методы). Соответственно результат будет "комом" нарастать. А return (n - 1) + (n - 2) просто вернёт значение, произведя математическое действие. Передав методу параметр 5, он вернёт 7
Потому что рекурсии в твоем примере (n - 1) + (n - 2) нет. Ответ будет не верным. А алгоритм для вычисления рекуррентный, поэтому без рекурсии никак. Запись вида fibNative(n - 1) + fibNative(n + 2) рекурсивна, функция вызывает саму себя дважды, рекомендую почитать про рекурсию если не понятно все равно.
понял, спасибо!
Вообще, в среднем вычисление числа Фибоначчи с помощью этого алгоритма занимает 50 тысяч лет 😂 Размотало 😂
Что скажете по поводу моей реализации метода получения числа Фибоначчи?
class Fibbonacci{
static final int n0 = 0;
static final int n1 = 1;
static long toGetNumber(int n){
if (n < 2) return n;
else{
long sum2 = n0, sum1 = n1;
for(long x = 2; x
Тот случай, когда умники сами себя перемудрили. Я бы сразу начал решать путём последовательного складывания чисел, а не по "мудрой" и красивой математической формуле. Пытался как-то составить программу по нахождению простых чисел, чуть не поседел, переводя математическое описание в код! Оказалось, такое число должно делиться без остатка только на само себя и всё!
да он с книги все берет) случаино книгу увидел и там то же глава начинается с фибоначи, но там понятнее показано. ведать все его курсы так и сделаны из книг со своей интерпритации. Причем он сложность алгоритма так и не показал как считать)
Честно говоря рассчет не верный, лонг заканчивается на 92 элементе массива
Я так и не понял, чесло 0 считать или нет? Если считать, то 5 - получается шестым числом, или 0 - это нулевое число Фибоначи? :)
З.Ы. Спасибо за видео!!!
Можно считать, можно не считать. Даже в википедии приведено два варианта.
спасибо большое!
при n+1, видимо, не считают (точнее начинают считать с 0. Т.е 0 (это нулевое число), 1 (1-е число), 1 (2-е число), 2 (3-е число) и т.д)
это всё конечно очень хорошо, но что делать если и тип лонг переполнится?)
Использовать класс BigInteger.
Спасибо за восхитительные уроки! (Кстати именно при Fn92 он уже переполняется -> 7540113804746346429).
Но уроки и правда хорошие. Как досмотрю ютуб - подпишусь на новый курс.
Заебись, а то что 100-ый элемент нельзя через long посчитать, то похер)))) Число 100-го элемента считается через BigInteger и оно будет немного больше...
100-й элемент вычислило за мгновение... Я что-то не так делаю?
Крутой курс) Что планируется в будущем???
Разбор задач из собеседований
Очень странный пример. Я всегда считал, что "наивный способ" это как раз такой, когда ты программно воссоздаешь ручной способ проделывания операций. А знание алгоритмов нужно, чтобы сделать все гораздо эффективнее неочевидным способом. Но на видео как раз обратная ситуация.
Я специально написал свое решение (с 3-мя переменными, без массива) перед тем, как было показано "наивное" и сильно удивился, когда узнал, что оно было оптимальным.
У меня вопрос: зачем изучать алгоритмы, если можно представить ручной способ, а потом просто запрограммировать его?
100тое число фиббоначи = 354224848179261915075 !
вот именно! алгоритм то неправильный !
function fibona(n){
let art = [n+1];
art[0]=0;
art[1]=1;
for(let i = 2; i
потому что 100-е число Фибоначчи выходит за пределы примитива long. Верхний лимит в данном случае - это 92-е число.