Есть только 3 ситуации для РЕКУРСИИ

Поделиться
HTML-код
  • Опубликовано: 10 апр 2024
  • erid: 2Vtzqwe64BZ | Успей воспользоваться кэшбеком 15% на регистрацию, ведь акция совсем скоро закончится!
    Переходи по ссылке и вперед в будущее с Aéza.net: aeza.net/?ref=extremecode
    Объясняю все риски рекурсии и поясняю в каких ситуациях её стоит использовать, а в каких нет. Самый полный гайд по рекурсии в языках программирования здесь.
    ---
    Подпишись на наш Telegram Канал 🖤 t.me/extremecode
    Лицензия Creative Commons Attribution 4.0 на использование трека Hyperfun (исполнитель: Kevin MacLeod): creativecommons.org/licenses/...
    Источник: incompetech.com/music/royalty-...
    Исполнитель: incompetech.com/
  • НаукаНаука

Комментарии • 527

  • @ExtremeCode
    @ExtremeCode  Месяц назад +21

    Братан, хорош, давай подпишись на наш Telegram канал, мы там байки и кулстори травим
    t.me/extremecode
    А для бустеров у нас есть эксклюзивный контент: boosty.to/extremecode

    • @LithiumDeuteride-6
      @LithiumDeuteride-6 Месяц назад

      Рекурсия классическая, задачка Ханойская башня. Есть ли решения чисто циклами, не знаю, делать не целесообразно.
      .386
      .model flat, stdcall
      option casemap:none
      include msvcrt.inc
      include macros.asm
      .code
      solve proc uses ebx source:dword, target:dword, interm:dword, n:dword
      mov ebx, n
      .if (ebx)
      solve(source, interm, target, &[ebx-1])
      printf("%d: %d -\} %d
      ", ebx, source, target)
      solve(interm, target, source, &[ebx-1])
      .endif
      ret
      solve endp
      align_proc
      main proc C argc:sdword, argv:ptr ptr, envp:ptr ptr
      local N:sdword
      mov esi, argv
      .if (argc

    • @user-kf9wj8cn7w
      @user-kf9wj8cn7w Месяц назад

      ruclips.net/video/b4-MCm6Px2E/видео.html&ab_channel=Toshka

    • @lev3271
      @lev3271 Месяц назад +1

      Ну чо имбицил,как ситуация с линуксом после запуска стим дека?

  • @prostoandrey7508
    @prostoandrey7508 Месяц назад +458

    Каждый знает, что рекурсия - это точное повторение одного и того же действия, раз за разом, в надежде на изменение.

    • @MahMoodTechnologies
      @MahMoodTechnologies Месяц назад +24

      Ты цикл описал

    • @MethodiusOgolkov
      @MethodiusOgolkov Месяц назад +22

      Безумие

    • @max_mgtow
      @max_mgtow Месяц назад +17

      Это безумие

    • @qrator2982
      @qrator2982 Месяц назад +9

      Это кайфарик

    • @AntonyKondr
      @AntonyKondr Месяц назад +20

      скорее рекурсия это когда ты открываешь холодильник, чтобы добраться до колбасы (база), но открыв холодильник, внутри ты видишь смузи и ещё один холодильник поменьше, открываешь его, и видишь авокадо и ещё один холодильник поменьше, и так n раз, пока не доберёшься до колбасы.
      наконец добираешься до колбасы, и далее ты можешь её забрать (возврат при базовом случае) либо ничего не забирать (вернуть 0, null, None, ...).
      Далее закрываешь холодильник, и опять, либо ты забираешь все эти отвратительные ненужные побочные продукты (смузи, авокадо...) (возвращаешь результат каждого рекурсивного вызова), либо выкидываешь (возвращаешь 0, null, None и т.п.), но холодильники надо обязательно закрыть все.
      и да, ныряя в холодильник, ты должен пообещать себе, что добравшись до колбасы, ты перестанешь дальше открывать холодильники и начнёшь их закрывать (условие выхода)

  • @qwerty2536
    @qwerty2536 Месяц назад +130

    Мне мой дед всегда говорил, что рекурсия нужна только там, где нужна рекурсия

  • @mndtr0
    @mndtr0 Месяц назад +65

    Владение рекурсией - это как владение кунг-фу, настоящие мастера не применяют его без необходимости...

  • @kittenlord3572
    @kittenlord3572 Месяц назад +282

    27 Хаскелль-разработчиков ликуют

    • @alexmartin4532
      @alexmartin4532 Месяц назад +9

      лол. у нас в универе была одна дисциплина - "Перспективные технологии разработки программных средств". так вот, мы в рамках этой дисциплины потоком из 3-х групп должны были прочитать Курта и сделать задачки из книги. плохо было всем, особенно учитывая опечатки, косяки перевода и несколько раз невозможность решения задачи со знаниями, имеющимися на момент решения задачи.

    • @voodookiidoo
      @voodookiidoo Месяц назад +45

      26*
      один которого я знаю нашел себе жену и пересел на нормальный язык

    • @9ikopb
      @9ikopb Месяц назад +22

      @@voodookiidoo 25. Михалыч не вышел из реанимации после кодревью.

    • @bxp_bass
      @bxp_bass Месяц назад +2

      один диз - мой, за хамоватость какую-то и пренебрежение всеми, кто другого мнения. Российский ютуб-с, что поделать, тут такой вайб.
      На хаскеле не писал ни дня, рекурсию не люблю.

    • @voodookiidoo
      @voodookiidoo Месяц назад +17

      @@bxp_bass спасибо за информацию брат, нам очень важно твоё мнение и дизлайк, обязательно дай знать всем в комментариями если захочешь отписаться от канала!

  • @turbo5856
    @turbo5856 Месяц назад +228

    Братан хорош, давай, давай, вперед, контент в кайф, можно еще? Вообще красавчик!

    • @TIKTOKCRAZY
      @TIKTOKCRAZY Месяц назад

      нпс

    • @LisOBGrus
      @LisOBGrus Месяц назад +1

      @@TIKTOKCRAZY Братан хорош, давай, давай, вперед, контент в кайф, можно еще? Вообще красавчик!

    • @mndtr0
      @mndtr0 12 дней назад

      Надо было рекурсивно зациклить эту фразу...

    • @LisOBGrus
      @LisOBGrus 11 дней назад +1

      @@mndtr0 как я вилкой зацикливать буду?

  • @rabchgames4211
    @rabchgames4211 24 дня назад +24

    Чтобы понять рекурсию, нужно сначала понять рекурсию

    • @lifekilled8236
      @lifekilled8236 7 дней назад

      Ее просто объясняют неправильно и не на тех примерах.
      Есть несколько объектов со ссылками друг на друга. И из метода одного объекта ты дергаешь такой же метод другого объекта. Это самый частый пример применения рекурсии. Он интуитивно понятен и очень полезен, потому что деревья - наше всë.
      Ну а qsort и фракталы самому писать никогда не понадобится. А если понадобится, то можно тоже сказать, что мы просто одну и ту же функцию применяем к разным элементам, что звучит максимально интуитивно. Но нет, надо обязательно какой-то шизы наговорить про то, что это якобы сложно

  • @justafish_
    @justafish_ Месяц назад +134

    5:34 > решение через цикл более массивное и вообще остойное
    Действительно, почему же оно такое массивное? Может потому, что добавилась проверка на 0, которая в рекурсивном решении куда-то проеблась, а может потому что ты расписал фор в ебучий вайл и начал жаловаться, что лишние счетчики добавились))

    • @Igorious92
      @Igorious92 Месяц назад +30

      var result = 1;
      for (var i = n; i > 1; --i) result *= i;
      return result;

    • @bxp_bass
      @bxp_bass Месяц назад +89

      Жду того дня, когда бы мне не удалось написать задачу итеративно вместо рекурсии. Пока такого не было.
      Я свой стэк берегу, ну его в пень.
      Вообще, оценивать каччество кода по количеству строк - это удел питонщиков-первогодок на степике и литкоде. Старики понимают, что хорошая и понятная портянка всегда лучше однострочного оголтелого вандализма.

    • @antizai.
      @antizai. Месяц назад +12

      Факториал вообще плохой пример для рекурсии. Например на питоне вообще цикл можно свести к одной строке
      def factorial(n):
      return sum([i for i in range(n+1)])
      Я думал действительно расскажет о 3х случаях когда без рекурсии не жить. Тема волнительная, иногда рекурсивное решение красивое, но нервничаю, до конца её непонимаю.

    • @bxp_bass
      @bxp_bass Месяц назад

      да и вообще, автор хамло какое-то, неприятно было смотреть. Второе видео подряд - и в обоих вайб "вы все говно, вы все не правы" А в другом видосе вообще мол CS, алгоритмы и база не нужны, кодить и собаки могут.
      Зря я на русский сегмент развлекательного кодерского ютуба зашёл.

    • @bxp_bass
      @bxp_bass Месяц назад +7

      @@antizai. в этом и минус - надо мозг сломать, чтобы осмыслить (хотя, с опытом ваще разницы нет), а вот нервничать стоит - потому что сэндвич из вызовов до Юпитера в стэке к добру не приводит.

  • @romich9865
    @romich9865 Месяц назад +13

    В общем-то я понял, что рекурсивные функции нужны для работы с рекурсивными объектами, довольно логично

  • @user-zb9qy9yc4b
    @user-zb9qy9yc4b Месяц назад

    С огромным нетерпением жду новых роликов! Прям всё в кайф

  • @zakr2
    @zakr2 Месяц назад +56

    Приятно было почти ничего нового не узнать про рекурсию. Только для деревьев ей пользовался, но любопытно заметить, что нарисованное дерево из видео которое треугольное превращается в квадратное скорее всего не использует рекурсию, я такую штуку недавно тоже рисовал)

    • @Alex_Krivonogov
      @Alex_Krivonogov Месяц назад +4

      Дерево можно обойти и без рекурсии. Адреса узлов можно помещать в обычный стек, а потом, как до конечного узла дойдёшь, извлекать из стека адрес родителя и т.д.

    • @daiske2867
      @daiske2867 Месяц назад +10

      @@Alex_Krivonogov то есть ты написал рекурсивный алгоритм используя вместо стека вызовов, стек дарованный тебе от Бога(стандартной библиотеки). Что фактически и означает, что ты не обошелся без рекурсии

    • @user-ur8hn1ux7i
      @user-ur8hn1ux7i Месяц назад +3

      @@daiske2867 На уровне синтаксиса - это не рекурсия, потому что нет вызова функции из самой себя. На уровне практического результата - это не рекурсия, потому что стек не забьётся. Кроме того, стек нужен только для обхода дерева в глубину, а для обхода в ширину используется уже очередь.

    • @daiske2867
      @daiske2867 Месяц назад +1

      @@user-ur8hn1ux7i если вам принципиальна работа со стековым кадром для идентификации алгоритма как рекурсивный, то конечно это не рекурсия, но с другой стороны рекурсия нужна исключительно для взаимодействием со стеком, не важно каким. В эту копилку вопрос, а разве у обычного стека не может быть проблем с переполнением памяти?
      Итого разница исключительно в типе стека, пусть это выдаст во мне ламера, но подскажите в каком случае принципиально иметь именно стековый кадр?

    • @user-ur8hn1ux7i
      @user-ur8hn1ux7i Месяц назад

      ​@@daiske2867 На уровне стековых кадров не существует понятия рекурсии, примерно как на уровне деревьев не существует понятия леса. Рекурсия определяется через вызов функций, который, очевидно, является более высокоуровневым понятием по отношению к стеку вызовов.
      "Итого разница исключительно в типе стека" - главная разница в логике верхнего уровня из которой мы к этому стеку приходим, но и на нижнем уровне есть нюансы.
      "разве у обычного стека не может быть проблем с переполнением памяти?" - конечно может, но это почти всегда память другого типа, которая по объёму в тысячи раз больше. Соответственно, в подавляющем большинстве случаев, просто переделав рекурсию на нерекурсию - мы избавимся от переполнения.
      Кроме того, алгоритм с ручным использованием стека не обязательно полностью копирует логику стека вызовов. Например, рекурсивный поиск по дереву, после нахождения элемента, должен будет последовательно подняться до корня, тогда как не рекурсивный может выйти сразу.

  • @darthunix
    @darthunix Месяц назад +2

    Например, есть задача обхода деревьев: ее можно решать или через рекурсию и стек операционной системы, или через собственный стек на хипе. Так вот, стек на хипе будет медленнее из-за работы с системным аллокатором (его кэш блоков памяти под нагрузкой фрагментируется и требует кучу лишних операций). А вот стек операционной системы куда быстрее (хоть он и конечного размера). Но хорошая новость в том, что деревья редко вырождаются в списки и на стеке нам нужно место только под высоту дерева. Короче, рекурсия при обходе деревьев - хорошее решение.

  • @olddbone
    @olddbone Месяц назад

    Посмеялся от души, вот это подача! Братан, давай, давай ещё контента!

  • @user-bp3hg9fu5t
    @user-bp3hg9fu5t Месяц назад +31

    Я как 30 лет назад не понимал накрена нужна рекурсия - так и сейчас не понимаю. При вызове подпрограммы в стек заносятся не только переменные, но и адрес выхода из функции и регистры процессора (возможно не все - это как компилятор решит). А регистры сейчас по 64 бита. Когда процесс дойдет до конца рекурсии - ему придется каждый раз обратно прыгать в функцию, исполнять до точки ret и опять прыгать, очищая стек. Умотаться можно. Если там этих вызовов даже пару тысяч - сколько бредовой работы для процессора. Вот на МК стэк делают в байт 400-1кб. и такой ересью не страдают. Если чо сильно не пинайте - я не программист )

    • @mk3mk3mk
      @mk3mk3mk Месяц назад +2

      Чё? 😅

    • @FoxSlyme
      @FoxSlyme Месяц назад

      Полностью поддерживаю эту точку зрения

    • @rainbowunicorn2946
      @rainbowunicorn2946 Месяц назад +2

      Хороший пример показан в видео: реализация алгоритма quicksort. Использование рекурсии позволяет существенно короче описать логику - такой код писать быстрее и проще, так как он понятнее.
      Но ты прав насчёт лишней траты ресурсов (+ возможно переполнение стека, и иногда просто объективно удобнее использовать циклы). Злоупотреблять этим не стоит.

    • @MyOwnShadowEclipse
      @MyOwnShadowEclipse Месяц назад +3

      @@rainbowunicorn2946 Это красиво и понятно, но это жесть какая-то. Массив на 1000 элементов при такой реализации в памяти скопируется сначала в два вызова подфункции. Потом в них еще раз эти два кусочка скопируются в четыре кусочка. И так 10 уровней вложенности. И всё в стеке.
      А. Ну и в худшем случае, стек может доходить до размера массива, если не повезет и массив уже будет упорядочен по убыванию и его надо будет развернуть. А значит из 4Кб чисел int можно вполне реально получить 4Мб. Это если нет ограничений на размер стека. А-то можно просто StackOverflow получить.
      UPD: а не. Если я правильно понял, то можно будет получить 4МБ если даже просто отсортированный массив на вход подать. Тут нет проверки на отсортированность. А спихивать всё в левый массив, что меньше pivot, что в правый - если всё больше pivot. Разницы никакой.

    • @rainbowunicorn2946
      @rainbowunicorn2946 Месяц назад +1

      @@MyOwnShadowEclipse спасибо за подробный анализ! Тем не менее, потребность в памяти не растёт так быстро, так как разделение массива производится не параллельно, а последовательно, и с каждым шагом на стек добавляется массив всё меньшего размера. При этом, когда работа с какой-то частью массива будет закончена, она будет убираться со стека. Затраты памяти в худшем (!) случае удвоятся, а в среднем - увеличатся на log (размер массива). Это можно пережить, особенно при учёте того, что на современных устройствах размер стека - сотни мегабайт. Да, перемещение кусков массива туда-сюда стоит времени, но это компенсируется тем, что операций для сортировки нужно совершить намного меньше. Экономия существенно превышает дополнительные затраты.

  • @user-ek9nj9dl1u
    @user-ek9nj9dl1u Месяц назад

    Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще? Рекурсия, такая рекурсия...

  • @user-lk1tg5xx8p
    @user-lk1tg5xx8p Месяц назад

    Хорош братан так держать, спасибо за контент, давай давай живи долго и процветай.

  • @Alex113234
    @Alex113234 Месяц назад +4

    Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @user-hj9ly9sn4o
    @user-hj9ly9sn4o Месяц назад +4

    Рекурсией удобно какие-то форматы парсить. Компиляторы писать, директории, данные от другой системы разбирать. И то если посидеть подольше, может быть через стек/очередь сделать лучше с конфигом отдельно. Но с рекурсией код будет проще и понятнее и легче поддерживать его. Отлаживать компилятор со стеком тот еще пиздец.

  • @user-fc3gh1rb7w
    @user-fc3gh1rb7w Месяц назад +14

    я уже думал накукарекать тут негатива на 10 страниц, но, досмотрев до конца, полностью согласен с автором! Рекурсия незаменима (лично для меня) при работе с деревьями. Во всем остальном она н**й не нужна!

    • @siteted2013
      @siteted2013 Месяц назад

      И с деревьями ее можно заменить на циклы. Я часто для этого использую очередь или стек и итерируюсь по детям добавляя их в контейнер

    • @SuperG000d
      @SuperG000d Месяц назад

      Если узлы деревьев нужно по уровням обрабатывать, то циклом даже проще

    • @TheRuthenium44
      @TheRuthenium44 24 дня назад

      Какой смысл в деревьях рекурсия, кроме упрощения говнокодинга?

    • @user-fc3gh1rb7w
      @user-fc3gh1rb7w 23 дня назад +1

      @@TheRuthenium44 вырастишь- поймешь.

    • @TheRuthenium44
      @TheRuthenium44 23 дня назад

      @@user-fc3gh1rb7w Кормен смотрит на твой говнокод, как на говнокод

  • @user-cw1xi5vq2n
    @user-cw1xi5vq2n Месяц назад

    Братан хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик!

  • @vladk4144
    @vladk4144 Месяц назад +3

    С первым вариантом согласен. Иногда (примерно раз в пару лет) пишу рекурсию просто потому что хочу написать рекурсию. Хотя можно и без неё.
    Иногда пофлексить рекурсией можно.

  • @black.tea.amateur.forever
    @black.tea.amateur.forever Месяц назад

    Братан,хорош,давай давай,вперёд! Контент в кайф,можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @user-zg4yg4kj5j
    @user-zg4yg4kj5j Месяц назад

    Братан - хорош! Давай-давай вперёд! Контент в кайф! Можно ещё! Вообще красавчик!

  • @koliasinitsa7725
    @koliasinitsa7725 Месяц назад +1

    Братан хорош, давай, давай, вперед, контент в кайф, можно еще? Вообще красавчик

  • @-mishana-
    @-mishana- Месяц назад +6

    ""одна ошибка и ты ошибся"" как глубоко

  • @2009Spread
    @2009Spread Месяц назад +2

    переживал, что не будет рекламы, но порадовал. Для того чтобы понять рекурсию - нужно понять рекурсию !

    • @user-mn3um5vx6m
      @user-mn3um5vx6m Месяц назад +1

      Рекурсивно получается)

  • @ivansaraiev7776
    @ivansaraiev7776 Месяц назад

    Братан, хорош, давай, давай, давай, вперёд! Контент вообще в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @denistyutkin2662
    @denistyutkin2662 Месяц назад

    Братан, хорош, давай, давай, давай, вперёд! Контент вообще в кайф, можно ещё? Вообще красавчик!

  • @user-gb3lq6pk7n
    @user-gb3lq6pk7n Месяц назад

    Спасибо за видео, жду ещё!!!

  • @vector5605
    @vector5605 Месяц назад +39

    За все время программирования у меня была ровно одна ситуация когда пришлось пользоваться рекурсией. Нужно было перебрать все папки и файлы(со всеми вложениями) в произвольной папке. Тогда я просто слямзил код с стак оверфлоу и ничего не понял.

    • @aviator1472
      @aviator1472 Месяц назад

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

  • @g_host
    @g_host Месяц назад

    Классно видео, было бы оно раньше)
    Нам на 2 курсе когда проходили рекурсию препод заявил, что все можно реализовать с помощью рекурсии, но не с помощью циклов.
    Этот факт быстро опровергли книги и статьи в интернете 😢🎉

  • @iamprettyuseless
    @iamprettyuseless Месяц назад

    Братан, хорош, давай ещё, контент в кайф!
    Прочитал первые 40 страниц SICP, и с кайфом смотрел.

  • @user-dv2bd9ch8k
    @user-dv2bd9ch8k Месяц назад +1

    лайк не глядя за стЕк! было так же прекрасно, как на семинарах по информатике.

  • @user-xr3mb8is6l
    @user-xr3mb8is6l Месяц назад +1

    Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще? Давайте, пока

  • @unseewr1811
    @unseewr1811 Месяц назад

    5:20 - вариант с циклом, который показан позже, не может быть хуже по определению, учитывая то, что он хотя бы каверит 0. Не говоря уже о том, что вариант с циклом будто нарочно был удлиннён. Достаточно было засетить res = 1 и в вайле/форе множить пока число > 1

  • @flamberkruds7912
    @flamberkruds7912 Месяц назад +9

    Братан, красавяик, давай, давай еще! Контент кайф... Ждем продолжение...

  • @testovtest3881
    @testovtest3881 Месяц назад

    братан хорош, давай давай, контент в кайф, можно почаще!

  • @____5461
    @____5461 Месяц назад +1

    Братан хорош, давай, давай, вперед, контент в кайф, можно еще? Вообще красавчик! Можно вот этого вот по чаще? Давайте пока

  • @user-xg3er7dw8y
    @user-xg3er7dw8y Месяц назад

    наконец то видео с хорошим соотношением трёпа и пользы - редко на этом канале такие попадаются нынче

  • @stepanmarkov7925
    @stepanmarkov7925 Месяц назад +1

    Рекурсию следует использовать в метапрограммировании, при раскрытии шаблонов, чтобы сгенерировать код без рекурсии. Так же стоит использовать рекурсию, когда компилятор ее раскрывает самостоятельно . Как итог : красивый короткий и эффективный масштабируемый код.

  • @MsBrotherh
    @MsBrotherh Месяц назад +2

    Братан, МЕГАХАРОШ, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @kailonfors2478
    @kailonfors2478 Месяц назад +1

    Перебирал файловое хранилище по папкам для сопоставления структур данных. Когда только сел, понял что циклом придется писать несколько сотен строк кода, а когда оформил через рекурсию в 10 строк понял, что такое кайф

  • @user-xk2lb2ob8p
    @user-xk2lb2ob8p Месяц назад

    Обожаю рекурсию, так же как и древовидные структуры данных. Интеграция, миграция, отложенная инициализация таких данных в UI.

  • @taratara2509
    @taratara2509 Месяц назад

    Один из лучших монтажей которые я когда-либо видел !)

  • @mikhailstotsik3226
    @mikhailstotsik3226 Месяц назад

    Бро ты лучший!! чуть со стула не упал

  • @fredbearplay787
    @fredbearplay787 Месяц назад +9

    Писал сапёра на реакте (ради эксперимента). Игровое поле у меня представляло собой матрицу структур, каждая из которых хранила значение текущей ячейки и пару логических переменных, отвечающих за состояние ячейки (закрыта - открыта, флаг есть - флага нет, и т.п.). Самой сложной задачей для меня стало цепное открытие ячеек - когда игрок нажимает на пустую закрытую ячейку, все рядом стоящие пустые ячейки должны автоматически открыться вплоть до ближайших ячеек с цифрами, стоящих сплошной линией, либо до конца поля, если ячеек с цифрами рядом нет. В голову кроме рекурсии ни одна мысль не приходила, да и без раздумий вполне логично, что циклически выполнять цепное открытие ячеек будет сложной и ненужной работой. В результате у меня получилось. При нажатии на ячейку, игра выполняла функцию открытия текущей ячейки и запускала её относительно восьми соседних ячеек, если они являлись пустыми. Таким образом, механика была реализована. Рекурсией пользуюсь не часто, но конкретно в этом случае она мне очень сильно помогла.

    • @tayzlelavarez6848
      @tayzlelavarez6848 Месяц назад +1

      Интересно поделился своим примером использования рекурсии. Я тоже могу своим поделиться, но нахер это кому-то надо. Скажу лучше вот что: "Рекурсией пользуюсь не часто ... ", - так сказал, будто это какой-то предмет, который вот на столе лежит, и мы либо используем его, либо он лежит и мы его не трогаем. В данном случае этот предмет - это именно что КОГДА МЫ ВЫЗЫВАЕМ ФУНКЦИЮ ИЗ ЕЁ ЖЕ ТЕЛА. Т.е слово "рекурсия" в этом комментарии использовано в смысле что: "рекурсия - это когда в коде мы делаем так".
      Иными словами я хочу сказать, что в данном случае у слова использован один из множества смыслов, всё. Обозначать словом "рекурсия" можно еще много чего еще. И интересно, что люди часто ОБЩАЮТСЯ одним и тем же словом, но каждый из двух использует его в ОТЛИЧНОМ смысле, и ОБА при этом этого не замечают, и получается шизоидный цирк, который для участников не заметен, что они общаются вдвоем, но на самом деле сами с собой.
      Это я щас дал бесполезный комментарий на бесполезный комментарий на бесполезное видео.

    • @user-mn3um5vx6m
      @user-mn3um5vx6m Месяц назад +3

      ​@@tayzlelavarez6848
      В одном из смыслов - рекурсивно получается)

    • @FoxSlyme
      @FoxSlyme Месяц назад

      Я бы это реализовал через буфер ячеек. Пока буфер не пуст, достаём одну ячейку, и если на ней 0 и она не открыта, открываем ячейку и добавляем соседние ячейки в буфер по тому же условию.

    • @fredbearplay787
      @fredbearplay787 Месяц назад

      ​@@tayzlelavarez6848будь немного проще) Это всё сплошное "буквоедство". При недопонимании всегда что-то можно уточнить, а не стараться вложить в одно слово миллион смыслов. Для меня рекурсия и есть ситуация, когда функция вызывает сама себя. Соответственно, "рекурсией редко пользуюсь" - редко использую вышеописанный принцип.
      Видео в целом, мне кажется, не имеет столь серьёзного направления. Разумеется, автор хотел что-то сказать, он это сделал, но видео явно на приколе, а не какой-нибудь урок по использованию рекурсии. Поэтому и комментарии тут выглядят как беседа на курилке. Я лишь захотел написать своё отношение и свой опыт. Кому надо - прочитают, не надо - пролистают. Я просто поделился мнением и ситуацией)

    • @fredbearplay787
      @fredbearplay787 Месяц назад

      @@FoxSlyme нуу, учитывая то, что у меня был двумерный массив, я не заморачивался, и просто пускал рекурсию по соседним ячейкам)

  • @Colorless_mouse_catcher
    @Colorless_mouse_catcher 10 дней назад

    Братан хорош, можно почаще, да, вот это всё

  • @9ikopb
    @9ikopb Месяц назад +2

    Разные типы рекурсии определяют ещё потому, что есть разные методы трансляции и оптимизации рекурсии в машинный код. Дроп зе майк!

  • @Alex_Krivonogov
    @Alex_Krivonogov Месяц назад +4

    Факториал можно найти через тот же цикл for(непонятно, что автор там нелаконичного наговорил):
    int fact(int n){
    int res = 1;
    for(int i = 2; i

    • @Senteggo
      @Senteggo Месяц назад +3

      а любой цикл можно реализовать через рекурсию, и что? Польза рекурсии в тому, что в некоторых задачах она значительно облегчает роботу

    • @f0kes32
      @f0kes32 Месяц назад +1

      с другой стороны, в функцию можно всегда прокидывать глубину стека и останавливать при больших значениях.

    • @user-ip2fg9up8u
      @user-ip2fg9up8u Месяц назад

      Зависит от яп. Обычно, рекурсия медленнее

  • @IqweoR
    @IqweoR Месяц назад

    Братан хорош, давай, давай, вперёд, контент в кайф, можно еще вообще красавчик можно вот этого вот почаще давайте пока

  • @user-vw1iq6hm6p
    @user-vw1iq6hm6p Месяц назад +6

    У Тимофея Хирьянова в плейлисте по алгоритмам и структурам данных на с++ есть 3часовая лекция на эту тему, и определение такое же как в видосе)

  • @alexzshow6314
    @alexzshow6314 Месяц назад

    А вот это реально интересно, давай вот подобного почащ

  • @user-dq6xx9kb8p
    @user-dq6xx9kb8p 17 дней назад

    Люто, бешено аплодирую, братан, все дела, ты молодец

  • @DaddyTorque
    @DaddyTorque Месяц назад +1

    Не только для работы с деревьями.
    Есть у вас, например, многомерный массив (или многообразие в многомерном пространстве). Допустим, вам удалось написать такую функцию, что она за один шаг рекурсии понижает размерность задачи на 1.
    Поскольку многомерные массивы растут в объёме очень быстро, то глубина рекурсии никогда не будет большой (скорее память для данных кончится, чем глубина рекурсии превысит 6 или 7).
    Короче говоря, когда глубина рекурсии растёт не очень быстро (не быстрее чем log от объёма данных) - не грех её использовать.
    А деревья - это просто частный случай этого условия.

  • @naivrick9782
    @naivrick9782 Месяц назад

    Бро норм говоришь, сюжет от души, говори ещё и по чаще

  • @shestakovdab
    @shestakovdab Месяц назад

    Братан, хорош, давай давай, вперёд кайф. А вообще правда очень люблю твои видосы, они мемные и смешные, а больше мне и не надо (разве что придумаешь как интегрировать сиськи в ролик и чтобы уже полезная информация не утекала мимо ушей из-за большой потребления сиськами количества памяти и внимания, что сложно)

  • @user-fg7hf4qo8m
    @user-fg7hf4qo8m Месяц назад

    Очень самокритично, уважаю

  • @serhiitelf6298
    @serhiitelf6298 Месяц назад

    Братааан, хорооош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @stanislavp681
    @stanislavp681 Месяц назад

    Гистерезис например в ОУ идеальный случай рекурсии в устройствах подавления шумов и дискретизации сигналов. Сигнал не может изменяться резко на большой частоте, поэтому такой вид рекурсии облегчает подавление шумов. Рекурсия используется в TS и D триггерах которые образуют запоминающие ячейки. Именно симметрия рекурсивности(рекурентности) позволяет нам создавать регистры, оперативную память и т.п. то есть компьютеры

  • @user-xd1su3sk3i
    @user-xd1su3sk3i 17 дней назад

    Хорошо рассказываешь. С удовольствием поработал бы с тобой.

  • @sasichkamega
    @sasichkamega 6 дней назад

    Использовал рекурсию только на маленьких функциях (которые вызывают сами себя), которые легко понять, в остальном противник подобного, ибо спасибо, надебажился.
    Из сложных рекурсий только в темплейтах плюсовых, не скажу что рад этому, но там без вариантов, надо ждать рефлексию.
    С мнением автора по рекурсии согласен полностью.

  • @nickolayivanov670
    @nickolayivanov670 17 дней назад

    Только я подумал использовать рекурсию в своём говнокоде на сишечке и тут попадается Ваше видео. Чуть стек себе не порвал от такого.... Спасибо

  • @aristofer
    @aristofer Месяц назад

    Я делал рекурсию на пайтоне во время учёбы.
    Ещё она нужна на ЕГЭ для задания с рядами (те же факториалы, ряд фибоначчи и т.д.)

  • @Silververt
    @Silververt Месяц назад

    Огонь, братан молодец.

  • @U_Z_V_E_R
    @U_Z_V_E_R Месяц назад +1

    6:20 - я больше скажу -РАЗМЕРНОСТЬ стека фиксирована и равна единице (одномерное пространство).
    А вот с размером да - беда :)

  • @MaxisV
    @MaxisV Месяц назад +2

    спасибо за водичку, захлебнулся.

  • @aaaaaa-wt3uu
    @aaaaaa-wt3uu Месяц назад

    Не сильно глубокую рекурсию еще мб можно в обфускации заюзать, это как удар по яйцам, красноглазик расковырял функцию, а она на определенной итерации начинает работать иначе)

  • @fuk6508
    @fuk6508 Месяц назад

    Братан, хорош, давай давай вперёд, контент ваще в кайф!

  • @Oleksandr-Polishchuk
    @Oleksandr-Polishchuk Месяц назад +1

    Харош, зараза. Я б в 10 минут не вложился, но ведь нечего и добавить после тебя - пойду падованов подпишу на тебя.

  • @fostergrand4497
    @fostergrand4497 22 дня назад

    Фактически рекурсия нужна только для вложенных структур и рекурсивных алгоритмов, и в основном в случае, когда ручная организация стека накладна в плане отладки и читаемости кода.
    Например, когда глубина не известна, то есть нет возможности стартовать с точки конца рекурсии.

  • @DYH00000
    @DYH00000 Месяц назад +2

    гномик-циклокрад - фраза дня 😆. Давай братан, хорош

  • @lin1643
    @lin1643 Месяц назад +1

    Занималась прогой только в школе, половину слов не понимаю, но рассказываешь классно

  • @user-pv5qw6gj2f
    @user-pv5qw6gj2f Месяц назад

    круто, спасибо!

  • @PersonalSmile69
    @PersonalSmile69 Месяц назад

    всё по фактам, разнёс и объяснил

  • @zeuszanudav3474
    @zeuszanudav3474 Месяц назад +6

    Всем адептам рекурсии:
    удачи фиксить баг в функции с хвостовой рекурсией без тестов(было такое 1 раз в жизни). Я тогда проклял все: и ЯП, и автора кода, и авторов ЯПа, и ЭкстримЦоде задодно.

    • @user-fh3wg8oj6q
      @user-fh3wg8oj6q Месяц назад +3

      О нет. Нормальная рекурсия что, должна иметь возможность логировать информацию?

    • @user-mn3um5vx6m
      @user-mn3um5vx6m Месяц назад

      ​@@user-fh3wg8oj6q
      А это уже не адепт. Адепты так не могут.

  • @yobniares
    @yobniares Месяц назад

    когда-то делал систему продажи билетов через промоутеров - и директору понадобилось сделать систему кураторства, типа привёл прома и потом получаешь пару процентов с его дохода, и с того, что этот пром заработал на кураторстве и т.д.. до этого рекурсиями не баловался, но тут она пришла сама собой

  • @Dadadadam999
    @Dadadadam999 Месяц назад

    Рекурсия в реальных проектах часто используется в формате паттернов компоновщик и визитёр. Самый яркий пример, это работа с файловой системой и любой древовидной структурой в которой есть разные типы сущностей.

    • @winter-lb7id
      @winter-lb7id Месяц назад

      угу, да тот же xml обработать

  • @spinacker16
    @spinacker16 Месяц назад

    рекурсию в основном на собесах только спрашивают. граф, связный список или дерево обойти. в динамическом программировании еще часто используются. в случае продакшена лучше реализуйте обычный LIFO стек все же. это понятнее и безопаснее

  • @user-tk7nh1jw3y
    @user-tk7nh1jw3y Месяц назад

    Параметры во многих языках программиривония передаются на стеке, так что с точки зрения стека второй пример с параметром-аккумулятором мало чем отличается от первого.

    • @user-ur8hn1ux7i
      @user-ur8hn1ux7i Месяц назад

      Он отличается тем, что это хвостовая рекурсия, и она автоматически компилируется в цикл.

  • @eugene8863
    @eugene8863 Месяц назад +1

    ООО, я тоже только в переборе дерева использовал😄

  • @fleapse
    @fleapse Месяц назад +1

    Goto - юзать можно в очень низкоуровневых языках, как в целом и рекурсию, но например в питоне js и всяких интерпретируемых медленных языках лучше не юзать ничего кроме циклов, т.к. рекурсия там сильно ограничена и ты будешь постоянно ловить эксепшены, а готу вообще - хз есть ли в таких языках

    • @antoxa574
      @antoxa574 Месяц назад +2

      Вот и я не понял к чему он о goto так высрался. Видать наслушался "умных" блогеров)

    • @user-xh8mt4bj7e
      @user-xh8mt4bj7e 14 дней назад

      +100500. Интерпретатор явно не предназначен для рекурсии: в глубокой теории варианты "с рекурсивным вызовом" и "без рекурсивного вызова" отличаются тем, что в случае рекурсивного вызова функции помимо данных в стек идёт некая дополнительная инфа (адрес возврата, регистры, ...), которая отнимает время и место в стеке. Если второе не очень болезненно (в большинстве случаев стек "бесконечен", если это не какой-то микроконтроллер), то первое тупо жаль. За эту потерю времени хочется иметь какую-то компенсацию, например, упрощение циклов или что-то подобное. В случае интерпретирующих ЯП падение производительности при рекурсивном вызове функций настолько высоко, что компенсации не будет (лично я не видел таких случаев).

  • @daniildrugus7022
    @daniildrugus7022 Месяц назад

    Оч хорошо объяснил. Теперь буду трясти этими знаниями перед умниками рекурсионщиками

  • @BeZzzymec
    @BeZzzymec Месяц назад

    Все понял и очень интересно! Спасибо за контентъ. Братан хорош, давай еще, вперед назад лево право удар

  • @alexanderkomanov4151
    @alexanderkomanov4151 Месяц назад

    Thanks bro!!!

  • @lavshyak9640
    @lavshyak9640 Месяц назад +1

    А если у сложной структуры динамической вложенности вложенность окажется слишком велика, чтоб рекурсия не переполнила стек?

  • @AsaDesu-uj7pv
    @AsaDesu-uj7pv Месяц назад

    УРААААА, НОВОЕ ВИДЕО

  • @ShrekPNG
    @ShrekPNG Месяц назад +1

    В 5:57 quicksort через рекурсию выглядит красиво, но на деле говно, потому что хороший quicksort должен сортировать массив in place, а у тебя он кучу новых массивов создаёт. Тут конечно дело не в рекурсии, хотя в итеративном решении quicksort реализован вроде как правильно

  • @stalker32041
    @stalker32041 Месяц назад

    6:36, лучший вариант избегать - это вынести в одну переменную и скидывать ссылку на неё.
    Допустим у нас есть факториал
    int factorial(int* value) {
    if (*value == 1) {
    return 1;
    } else {
    return *value * factorial(&(*value -= 1));
    }
    }
    К сожалению я не могу с уверенностью сказать, что данный метод работает, нет под рукой компилятора C

  • @mykhailokiyan5821
    @mykhailokiyan5821 Месяц назад +5

    При использовании переменной-аккумулятора "acc" стек все-равно засерается точками выхода из метода. Если глубина вложенности изначально не известна, то нужно использовать только циклы, иначе через некоторое время получите переполнение стека

    • @user-ft9kc7ib1r
      @user-ft9kc7ib1r Месяц назад

      Если язык с tail call optimization - то нет. Функция по факту будет вызвана один раз.

    • @mykhailokiyan5821
      @mykhailokiyan5821 Месяц назад

      По факту, эта самая TCO сводится к преобразованию компилятором в плоскую итерацию. Он просто делает это неявно. Разработчику остаётся надеятся, что он не накосячил, и написал свою рекурсию способной к TCO.

  • @--7620
    @--7620 Месяц назад

    братан, контент огонь, давай также

  • @russianhotell
    @russianhotell Месяц назад

    Братан, хорош, давай еще

  • @arturnersisyan6081
    @arturnersisyan6081 Месяц назад

    Когда во время цифрового анализа (это там где миллионые циклы) решил с дури через рекурсию сделать и получил смачный мат от компа, понял что рекурсия как ром, по немногу приятно а если переборщить то можно в Челябинске очнуться.

  • @inex550
    @inex550 Месяц назад

    Юзаешь вместо рекурсии контейнер с очередью или стеком и заебца. Ещё не много capacity намазываешь исходя из каких-нибудь соображений

  • @DubinArtur
    @DubinArtur Месяц назад +2

    Сниму видео про то, как этот канал снял видео про рекурсию

  • @user-tu1pp2qj3i
    @user-tu1pp2qj3i 14 дней назад

    Господа, я всё понять не могу, а разве реализованный вариант с парамметром аккамулятором не будет точно так же засирать стек? только теперь мы до самой последней рекурсивной ступени храним не только переменную n, но и переменную acc? почему вдруг мы их перестали хранить на каждом шагу?

  • @grafgeleon2420
    @grafgeleon2420 Месяц назад

    ООО, кстати по поводу рекламки AEZA ну типо сам их юзаю. Фрау VPS имею, и VPN накручиваю только в путь. Так что рекламка не дурная, не то что галимые курсы от скилбокс и скилфэктори. Типо вот ну правда aeza норм.

  • @Rezedent12
    @Rezedent12 Месяц назад +1

    Пришёл к выводу, что рекурсия может быть полезна для реализации синтаксического разбора формул.

  • @Vanesment
    @Vanesment Месяц назад

    Так, т.е. в js хвостовая рекурсия будет работать? Или просто количество вызовов будет больше, перед тем как стек порвется?

    • @Senteggo
      @Senteggo Месяц назад +2

      нет, он для примера код привёл в js, но в нём этого нет. Насколько я знаю, в scala такое есть

    • @enosunim
      @enosunim Месяц назад

      Если вы решили разрешить проблему с помощью рекурсии, то теперь у вас две проблемы = )

  • @MaxiGouogle
    @MaxiGouogle 13 дней назад

    Искусство - это РЕКУРСИЯ!

  • @TheLevius
    @TheLevius Месяц назад +1

    если можно использовать reduce я использую reduce