Ханойские башни на Си

Поделиться
HTML-код
  • Опубликовано: 12 авг 2018
  • Постановка задачи.
    Рекуррентный алгоритм и его реализация.
    Курс молодого бойца по информатике (Язык Си).
    cs.mipt.ru/c_intro

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

  • @andrey7530
    @andrey7530 4 года назад +104

    все таки классные преподаватели получаются из выпускников МФТИ!!

    • @andrey7530
      @andrey7530 4 года назад +12

      @@kosiak10851 по твоему ответу понятно, что ты сам не далеко ушел от 9го класса!

  • @emilmaylow3094
    @emilmaylow3094 Год назад +5

    Господь сам спустился и начал заливать туториалы на Ютуб! Спасибо огромное, столько всего смотрел и только сейчас сумел понять!

  • @user-iq5wx7qq4v
    @user-iq5wx7qq4v 3 года назад +17

    Тимофей Фёдорович, огромное Вам спасибо!
    Не думал, что написание кода в Си может быть так увлекательно =)

  • @the_c0met22
    @the_c0met22 10 месяцев назад

    Я наконец понял рекурсию. Спасибо вам, Тимофей, вы лучший!

  • @saltsalt4083
    @saltsalt4083 4 года назад +1

    Вы очень приятный человек :)

  • @fontes5697
    @fontes5697 2 месяца назад

    Огромное спасибо за столь подробное и чёткое объяснение!

  • @Selex95
    @Selex95 4 года назад +8

    Спасибо, очень интересно и познавательно

  • @diasdauletov7213
    @diasdauletov7213 4 года назад +5

    Вы лучший! Благодарю)

  • @unsoc1able
    @unsoc1able 4 года назад +1

    Круто, спасибо! Очень познавательно и интересно.

  • @EgorMorgunov
    @EgorMorgunov 3 года назад +1

    Спасибо! Все стало полностью понятно!

  • @alexuspro26
    @alexuspro26 Год назад

    Восхитительно, спасибо.

  • @DiamondSane
    @DiamondSane 4 года назад +24

    Всё таки стоит сформулировать задачу, стоящую перед программистом: требуется напечатать инструкцию для перекладывающего.

  • @karura5135
    @karura5135 3 года назад +1

    Лучший учитель которого я знаю!

  • @culbaev
    @culbaev 4 года назад +7

    Видно что любит свою работу))

  • @user-gt3rb1su8t
    @user-gt3rb1su8t 3 года назад +1

    Спасибо за объяснение

  • @arthurasche4457
    @arthurasche4457 2 года назад

    Шикарно, спасибо.

  • @user-hw3el4hf6t
    @user-hw3el4hf6t 2 года назад +11

    Не пойму, за счет чего в данном алгоритме обеспечивается условие "не класть больший диск на меньший", если при перемещении это нигде не обрабатывается

  • @nikolasvobodova1028
    @nikolasvobodova1028 4 года назад +4

    Это магия какая-то, а не программирование

  • @no-user-found
    @no-user-found 4 года назад +9

    В голове так и не смог прокрутить. Рекурсия там, где она реально необходима слишком сложна для меня

  • @serhiipeksymov3739
    @serhiipeksymov3739 3 года назад +3

    Математика - это от Бога)) просто класс

  • @Sentinel1855
    @Sentinel1855 2 года назад +6

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

  • @user-oi7xs9st3i
    @user-oi7xs9st3i 3 года назад

    Спасибо большое!!!

  • @lkarlon6995
    @lkarlon6995 5 лет назад +23

    Чем дальше видео в плей-листе, тем меньше просмотров)) Спасибо, Тимофей, за труды!

    • @user-rn1xs5ne1h
      @user-rn1xs5ne1h 4 года назад +4

      Учёба и усилие над собов , всем в тягость))) так на любом образовательном канал, чем дальше, тем меньше просмотров. Мотивация слабеет)))

    • @regardsregards1414
      @regardsregards1414 3 года назад

      @@user-rn1xs5ne1h это да

  • @saltsalt4083
    @saltsalt4083 4 года назад

    Очень интересно

  • @temnihan
    @temnihan 2 года назад

    Гениально!!!

  • @andrey7530
    @andrey7530 4 года назад +13

    ниже пишут, что школьная задача :), да для 4го десятка это хорошая и интересная задачка, чтобы мозги растормошить )). в уме уже трудновато представить )) все решение

  • @linterrupt
    @linterrupt 3 года назад +13

    Вроде бы и понятно описание задачи на высоком уровне, но как это блять работает никак не могу представить. Будто у функции есть мозг, и он все сам делает

    • @linterrupt
      @linterrupt 3 года назад

      @@manuchehrml3315 соболезную

  • @user-xv3xp2ox9u
    @user-xv3xp2ox9u 2 года назад

    спасибо огромное

  • @marcozini8915
    @marcozini8915 4 года назад +5

    Для Ханойской башни я предлагаю простое и мнемоническое решение. Правило следующее:
    - перемещать наименьший диск по кругу, по часовой стрелке двумя различными способами:
    - Even для четных дисков (2, 4, 6, 8…): a -> b -> c -> a ->…
    ˗ для нечетных дисков (1, 3, 5, 7, 9…): a -> c -> b -> a ...
    - переместите меньший диск, из двух влево, на основной, это единственно возможная операция,
    - в следующем шаге переместите меньший диск снова по кругу, как показано выше
    - следующим ходом перемещайте диск единственным возможным способом ...
    и так далее, пока не будут доставлены все диски от начальной ставки "а" до конечной целевой ставки "с".
    Я надеюсь, что я был ясен, спасибо за ваше внимание и наслаждайтесь.

  • @MrKoshag
    @MrKoshag 3 года назад

    Спасибо!

  • @sumer4823
    @sumer4823 3 года назад

    супер!

  • @user-bombuser
    @user-bombuser 5 лет назад

    Супер

  • @user-ux4tc9cn1h
    @user-ux4tc9cn1h 4 года назад +3

    Тимофей, дайте видео как это сделать списками, или массивом чисел...спс

  • @dimalink4486
    @dimalink4486 Год назад +1

    Блин.Вот компьбтерные игры - это. Дима фанат игрушек! Надо будет записать в список сделать игрушку ХАнойская Башня. Я как то послднее времяч на Фри Паскле, и Паскаль АБВ. И также вот КуБэйсике64.

  • @vpa956
    @vpa956 4 года назад +2

    Уважаемый Тимофей, подскажите, возможна ли реализация на Пайтон без того чтобы вписывать в функцию три переменные (hanoi(n, i, k, tmp)) ? То есть, только через n, i и k, как в вашем примере на Си? Спасибо!

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

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

  • @user-hh5sd2qv8e
    @user-hh5sd2qv8e Год назад

    Круто , я ведь так пасьянс косынку расскладываю))) теперь надо запомнить как это кодом записать.А ханойская башня , Это косынка.

  • @naitside3410
    @naitside3410 2 года назад +1

    "рекурентный случай" - это тоже самое что рекурсия?

  • @umid7900
    @umid7900 Год назад

    👍👍👍

  • @MRaynold
    @MRaynold 10 месяцев назад

    Magic!😂

  • @databekmath7879
    @databekmath7879 5 лет назад

    👍

  • @alinalevina3814
    @alinalevina3814 Год назад

    Здравствуйте,помогите пожалуйста разобраться. Переписал прогу и запустил, все работат. Но я по коду не мооу понять. Почему по дебагу прога, когда выпоняется попадая на первый вызов hanoi( n-1, i, tmp) идет с новым пораметрами снова сверху до проверки n==1, а если это условие выполнятся из функции не выходит,а начинает исполнять код со второго printf ну и дальше аналогично по кругу, в итоге даже не порятно условие выхода из функции hanoi, если финальные значерия переменных 1,1,2 и tmp1. Помогите разобраться, пожалуйста.

  • @mew6085
    @mew6085 3 года назад +8

    6:25 Народ если что i k tmp это просто номера штырьков. Я полчаса думал откуда эта 6 взялась =)

    • @daanl88l
      @daanl88l 3 года назад +3

      Да то что это номера штырьков понятно. Не понятно как "пришли" к формуле i + k + tmp = 6. То что, это 1 + 2 + 3 понятно, то есть для конкретной задачи. Как эту формулу "увидели" изначально, когда в самый первый раз решали её на компьютере, вот что непонятно.
      Очевидно, что для 4-х штырьков это будет 1 + 2 + 3 + 4 = 10. Формула тогда i + k + p + tmp = 10 и tmp = 10 - i - k - p.

    • @vladimirvladimir199
      @vladimirvladimir199 2 года назад

      Всё это постепенно становится понятно.
      Но вот у меня другая проблема. При первом пробеге в рекурсии
      hanoi(n-1, i, tmp)
      Выходит так:
      hanoi(2, 1, 3)
      Далее идёт
      printf("move disc %d from %d to %d", n, i, k) , который должен был показать, что первым мы берём второй блинчик?? Ведь n теперь 2.
      Но программа прекрасно работает, и берёт первый. Как это понять?

    • @Stevend1
      @Stevend1 2 года назад +2

      @@vladimirvladimir199 ну ведь перед тем, как вывести это на экран, мы же вызываем опять эту функцию hanoi(n-1, i, tmp), получается, мы заходим внутрь ещё раз и так рекурсивно, пока не дойдём до n == 1. Вот тогда и первый раз в программа в консоль выведет наш printf, в котором n = 1. А потом, обратно, выходя в обратном порядке из функций, у нас будет выводится по очереди ответ. Таков алгоритм.

    • @vladimirvladimir199
      @vladimirvladimir199 2 года назад +1

      @@Stevend1 да, спустя время, начинаю понимать) спасибо за ответ)

    • @user-wk9dl9lu2t
      @user-wk9dl9lu2t Год назад +1

      @@Stevend1 но в голове всю эту последовательность сложно представлять😃

  • @user-ml3bk7sv8u
    @user-ml3bk7sv8u Год назад +1

    Спасибо за объяснение, не уверен, откуда взялось 1 + 2 + 3 = 6. То есть разве 1, 2 и 3 это не просто нумерация стержней, точно такая же как если бы a, b и с или 2 стержень 10 стержень и стержень x ? Буду благодарен если кто-то пояснит! Спасибо

    • @user-ts1kn7xx6j
      @user-ts1kn7xx6j 7 месяцев назад +1

      Насколько я понял (как математик, но не программист), автор хотел сделать обобщенное решение для 3-х стержней и n дисков. Т.е. чтобы было не важно, где была бы изначальная позиция башни и не важно где была бы конечная позиция башни. На рисунке в начале стержни пронумерованы 1, 2, 3 по порядку слева-направо. Это значит, что если начальная позиция (буква i) в задаче допустим находится на стержне №3, а конечная позиция (буква k) допустим на стержне №1, то очевидно что промежуточная позиция в такой конкретной задаче находится в позиции №2, т.е. temp = 2 (а это в том числе подчиняется формуле temp = 6 - i - k). И как бы мы не расположили начальную и конечную позицию башни (т.е. какие бы значения номеров стержней не приняли бы буквы i и k), промежуточная позиция temp всегда окажется под оставшимся единственным номером, который вычисляется по формуле temp = 6 - i - k. Обобщенная задача (общая задача) в математике нужна, чтобы всегда иметь решение для конкретных вводных начальных данных. В данной ситуации вводные начальные данные - это расположение начальной и конечной позиции башни на 3-х стержнях (оно может быть любое, кстати вариантов таких выборов - 6, это обычный расчет комбинаторной задачи), ну и еще начальные данные - это количество дисков в башне (но это уже вопрос про n дисков и наличие рекурсии). Так вот, если закрепить за начальной и конечной позициями башни какие-то конкретные номера стержней из этих 6 комбинаторных вариантов, то мы решим всего-навсего одну задачу. И программа будет выдавать всегда один и тот же ответ. А хочется, чтобы начальная позиция была произвольная среди этих 6 возможных вариантов. Тогда надо начальную и конечную позиции задать не конкретными номерами стержней, а буквами i и k, которые могут принять любое значение среди 1,2,3 (ну естественно что за исключением варианта i=k), тогда временный стержень будет последним оставшимся из 3-х стержней (его позиция должна быть занумерована, а сделать это можно с помощью формулы temp = 6 - i - k)

  • @Mani_Fast
    @Mani_Fast 2 года назад +1

    2:30 ))))

  • @KingDog25
    @KingDog25 Год назад

    Одно не понятно, откуда именно 6? Это результат сложения n+i+k или результат сложения номеров столбцов?

    • @dadoo6912
      @dadoo6912 Год назад +1

      у тебя всего 3 столбца
      сумма их порядковых номеров равна 6 (1 + 2 + 3)
      переменные i, k, tmp как раз таки и являются порядковыми номерами столбцов, а значит i + k + tmp = 6
      i и k передаются в функцию аргументами, соответственно мы сможем легко найти порядковый номер временного столбца следующим образом:
      tmp = 6 - i - k

    • @KingDog25
      @KingDog25 Год назад

      @@dadoo6912 уже разобрался, спасибо за ответ)

    • @lakutomafoso
      @lakutomafoso 9 месяцев назад

      @@dadoo6912 Спасибо, вы мне помогли

  • @user-nr5go1ji3b
    @user-nr5go1ji3b 4 года назад +9

    Очень простое решение,но ничего не понятно.

  • @risoukanpeki
    @risoukanpeki 8 месяцев назад +1

    Всё равно не понял. Как программа может сам понять что не надо ставить диск большего диаметра на меньшую? И как оно перемещает диски вообще по разному а в программе только 2 команды?

    • @nicholasspezza9449
      @nicholasspezza9449 5 месяцев назад +3

      программа умная, а ты нет

    • @risoukanpeki
      @risoukanpeki 5 месяцев назад

      @@nicholasspezza9449 умная лишь в этом. В остальном она тупее инфузории так как не сможет решить 1+1 или понять сейчас день или ночь

  • @oleksandrhomyak
    @oleksandrhomyak 4 года назад +1

    математика :)

  • @h57marquant28
    @h57marquant28 4 года назад +4

    Крайним случаем проще брать n=0 а не 1

  • @iustatem4363
    @iustatem4363 4 года назад +3

    Я знаю, как получит 5 по технологии

    • @ahil7800
      @ahil7800 3 года назад

      Надо сделать головоломку Ханойские башни

  • @Nizeztike
    @Nizeztike 6 месяцев назад

    Когда 64 диска будет?? Мне на дом задали

    • @nicholasspezza9449
      @nicholasspezza9449 5 месяцев назад +1

      для любого кол-ва дисков будет одно и тоже, уася.

  • @user-xd5np7yo4k
    @user-xd5np7yo4k 5 лет назад +1

    Решение обобщенной проблемы Ханойских башен."Теория и практика строительства Ханойских башен", Жигалик С. Н.

  • @user-xd5np7yo4k
    @user-xd5np7yo4k 5 лет назад +1

    "Теория и практика строительства Ханойских башен", Жигалик С. Н.

  • @sofiered
    @sofiered 4 года назад

    Только сейчас узнаю, что это никакая не легенда, а задача, придуманная математиком. Сегодня для меня в мире стало немного меньше красоты. Жалко.
    А решение прекрасное - спасибо!

    • @mitri9240
      @mitri9240 4 года назад +1

      Вы реально верили в эту легенду? Красоты в решении рекурсией этой задачи для меня куда больше чем в этой легенде.

    • @mitri9240
      @mitri9240 4 года назад

      @@kosiak10851 везде есть причинноследственная связь. Если вы не знаете причины, значит и следствие должно быть под вопросом.

    • @mitri9240
      @mitri9240 4 года назад

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

    • @sofiered
      @sofiered 4 года назад

      @@mitri9240 не в саму легенду о наступлении конца света в момент перекладывания последнего колечка, а в существование такой легенды у одного из народов.

    • @mitri9240
      @mitri9240 4 года назад

      @@kosiak10851 у людей не было причин считать, что они являются центром чего-то. Это просто психология. Аристотель подверг сомнению, то что мы находимся на диске, хотя мог отнестись к этому как к данному. Были разные теории, в том числе те, что считали возможным и то, что начало системы координат находиться не у нас под ногами. А что касается реакции церкви она не только сейчас бугуртит на всё подряд, имя Джордано Бруно вам о чем-нибудь говорит?
      В целом религия пропитана необоснованной эгоцентричностью человечечества. Отрицать это, если вы прочитали Библию, просто глупо. Если человек ученый то все на свете он будет ставить под сомнение, не просто с головы брать толкование всего, а нелогичность будет его раздражать. Взять вот аксиомы в геометрии, никто не говорит что они верные, хотя православные любят утверждать, что математики принимают их на веру, но тогда бы не появлялось неевклидовой геометрии, по типу геометрии Лобачевского. Он поставил под сомнение аксиому, и показал, что если взять те аксиомы выйдет вот так. Взять другие выйдет по другому, но они не являются опорой, они лишь условие задачи. Мы верим в аксиому когда решаем задачу которая в условии утверждает, что эти аксиомы являются верными. Простой пример: находясь на шаре, выбрать кратчайшим путем, между двумя точками, прямую будет попросту неверно, самолёты тратили бы лишнее топливо при перелёте через океан если бы полагались на аксиомы сформулированные Евклидом для плоскости.

  • @user-xd5np7yo4k
    @user-xd5np7yo4k 5 лет назад

    "Теория и практика строительства Ханойских башен"

  • @non5309
    @non5309 2 года назад +1

    Вроде все понятно, но на самом деле не понятно.

  • @hieverybody359
    @hieverybody359 10 месяцев назад

    Чат gpt множит все ваши лекции и других тоже на ноль x0. Вся инфа в идеальном образе получается от искусственного интеллекта

    • @isaacfoster9661
      @isaacfoster9661 10 месяцев назад

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

  • @Ca1vema
    @Ca1vema Год назад +2

    Очередное видео которое просто ставит перед фактом, что задачу нужно начинать с конца и перекладывать n-1 дисков без объяснения как к такому решению пришли. В чём полезность? :(

  • @Sinkaiya
    @Sinkaiya Год назад +1

    Неужели нельзя было снять так, чтобы было без этого вот "ой, я сам толком не понимаю, надо вот так, а, нет, это неправильно, надо не вот так а вот эдак, а, хотя нет, подождите"? Только ещё больше запутал. >:(

  • @oleksandrhomyak
    @oleksandrhomyak 4 года назад +1

    тут нет никакого по сути программирования.. чистая математика

    • @mitri9240
      @mitri9240 4 года назад +5

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

  • @annasmetanina7290
    @annasmetanina7290 2 года назад +1

    #include
    // Функция показывает движение from -> to
    void move(int to, int from) {
    printf("%i -> %i
    ", to, from);
    }
    // печатает решение для головоломки размера n,
    // сдвигая n дисков из колонны "from"
    // в колонну "to"
    void hanoi(int n, int to, int from) {
    if (n == 1)
    move(to, from);
    else {
    int tmp = 6 - to - from;
    hanoi(n - 1, from, tmp);
    move(from, to);
    hanoi(n - 1, tmp, to);
    }
    }
    int main(void) {
    int n;
    printf("Insert n: ");
    scanf("%i", &n);

    hanoi(n, 1, 3);

    return 0;
    }