Ханойская башня: рекурсивный алгоритм

  1. Нет, вам не нужно использовать веб-крючок для сохранения данных контекста. Вы можете использовать XMLHttpRequest, fetch или JavaScript SDK для таких сервисов, как Playfab или Firebase, для хранения данных. Фактически, мы бы даже не рекомендовали вам использовать веб-крючок для сохранения данных, потому что, если проигрыватель отключит сообщения от вашего бота, вы не получите никаких обратных вызовов веб-крюка.

  2. Вы можете проверить URL обратного вызова с помощью панели инструментов разработчика, включая кнопку «Показать последние ошибки», которая действительно полезна для выявления любых проблем. Вы также можете получить дополнительную информацию из пункта Webhooks на левой панели навигации.

  3. The developer dashboard showing the webhook settings

    1. Возможно, вам потребуется уточнить, что вы подразумеваете под «вашим личным https URL». Пока Facebook может попасть на ваш URL-адрес, все будет работать. Вы не можете, например, использовать localhost URL.
63
задан titaniumdecoy 7 February 2016 в 02:31
поделиться

8 ответов

Как насчет чего-нибудь в этом роде: Это оставляет диск №n только на штифте A

  • переместить диск №n из A в C
  • переместить n − 1 дисков из B в C, чтобы они сели на диск №n
  • Совершенно ясно, что сначала вам нужно удалите диски n - 1, чтобы получить доступ к n -му. И что вы должны сначала переместить их на другую привязку, а не на то место, где должна появиться полная башня.

    Код в вашем сообщении имеет три аргумента, помимо количества дисков: исходный привязка, a привязка назначения и временная привязка, на которой можно хранить диски между собой (где каждый диск размером n - 1 подходит).

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

    46
    ответ дан 24 November 2019 в 16:20
    поделиться

    Просто посмотрел это видео сегодня: Рекурсия 'Сверхдержава' (в Python) - Компьютерофил и я думаю, что мы должны определенно иметь код профессора Thorsten Altenkirch в здесь, поскольку это - очень красивая и изящная часть кода рекурсии и не всегда, что у нас есть качественное видео для показа в ответе.

    def move(f,t) : 
        print("move disc from {} to {}!".format(f,t))
    
    def hanoi(n,f,h,t) : 
        if n==0 : 
            pass
        else :
            hanoi(n-1,f,t,h)
            move(f,t)
            hanoi(n-1,h,f,t)
    

    наш hanoi функция имеет 4 параметра:

    • n: количество дисков
    • f: источник, где диски (от)
    • h: промежуточный шаг 'через' [1 110] (помощник)
    • t: конечное положение, где мы хотим, чтобы диски были в конце (цель)
    >>> hanoi(4,"A","B","C")
    move disc from A to B!
    move disc from A to C!
    move disc from B to C!
    move disc from A to B!
    move disc from C to A!
    move disc from C to B!
    move disc from A to B!
    move disc from A to C!
    move disc from B to C!
    move disc from B to A!
    move disc from C to A!
    move disc from B to C!
    move disc from A to B!
    move disc from A to C!
    move disc from B to C!
    

    enter image description here

    0
    ответ дан 24 November 2019 в 16:20
    поделиться

    Я согласен, что это не сразу, когда вы впервые смотрите на него, но это довольно просто, когда вы дойдете до него.

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

    Рекурсивный случай: ваша башня имеет размер n > 1. Таким образом, вы перемещаете верхнюю башню размера n-1 на дополнительный колышек (на), перемещаете нижнюю "башню" размера 1 на целевой колышек и перемещаете верхнюю башню от точки на место назначения.

    в простом случае у вас есть башня высотой 2:

     _|_    |     |
    __|__   |     |
    ===== ===== =====
    

    Первый шаг: переместите верхнюю башню 2-1 (= 1) на дополнительный колышек (допустим, средний).

      |     |     |
    __|__  _|_    |
    ===== ===== =====
    

    Далее: переместите нижний диск к месту назначения:

      |     |     |
      |    _|_  __|__
    ===== ===== =====
    

    И, наконец, переместите верхнюю башню (2-1) = 1 к месту назначения.

      |     |    _|_
      |     |   __|__
    ===== ===== =====
    

    Если подумать,даже если башен было 3 или больше, всегда будет пустой дополнительный стержень или стержень со всеми большими дисками, который будет использоваться рекурсией при замене башен местами.

    13
    ответ дан 24 November 2019 в 16:20
    поделиться

    Это просто.

    1
    ответ дан 24 November 2019 в 16:20
    поделиться

    Как студент, изучающий компьютерные науки, вы, возможно, слышали о математической индукции. Рекурсивное решение для Ханойской башни работает аналогично - только другая часть состоит в том, чтобы действительно не потеряться с B и C, как если бы закончилась полная башня.

    0
    ответ дан 24 November 2019 в 16:20
    поделиться

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

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

    1
    ответ дан 24 November 2019 в 16:20
    поделиться

    Хорошее объяснение рекурсивной реализации Ханоя можно найти на http://www.cs.cmu.edu/~cburch/survey/recurse/hanoiimpl.html . 12114] Резюме: если вы хотите переместить нижнюю пластину с ручки A на стержень B, вам сначала нужно переместить все меньшие пластины поверх нее из точки A в C. Второй рекурсивный вызов - затем переместить пластины, которые вы переместили. в C обратно на B после того, как ваш базовый вариант переместил одну большую пластину из A в B.

    14
    ответ дан 24 November 2019 в 16:20
    поделиться

    Год назад я прошел курс функционального программирования и нарисовал эту иллюстрацию для алгоритма. надеюсь, что это поможет!

    (0)  _|_         |          |
        __|__        |          |
       ___|___       |          |
      ____|____  ____|____  ____|____
    
    (1.1) |          |          |
        __|__        |          |
       ___|___      _|_         |
      ____|____  ____|____  ____|____ (A -> B)
    
    (1.2) |          |          |
          |          |          |
       ___|___      _|_       __|__
      ____|____  ____|____  ____|____ (A -> C)
    
    (1.3) |          |          |
          |          |         _|_
       ___|___       |        __|__
      ____|____  ____|____  ____|____ (B -> C)
    
    
    
    (2.1) |          |          |
          |          |         _|_
          |       ___|___     __|__
      ____|____  ____|____  ____|____ (A -> B)
    
    
    
    (3.1) |          |          |
          |          |          |
         _|_      ___|___     __|__
      ____|____  ____|____  ____|____ (C -> A)
    
    (3.2) |          |          |
          |        __|__        |
         _|_      ___|___       |
      ____|____  ____|____  ____|____ (C -> B)
    
    (3.3) |         _|_         |
          |        __|__        |
          |       ___|___       |
      ____|____  ____|____  ____|____ (A -> B)
    

    Задача трех колец была разделена на задачу 2 двух колец (1.x и 3.x)

    31
    ответ дан 24 November 2019 в 16:20
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: