WedX - журнал о программировании и компьютерных науках

Алгоритм рекурсии Ханойской башни

У меня проблема с пониманием этого алгоритма рекурсии Ханойской башни:

public class MainClass {
  public static void main(String[] args) {
    int nDisks = 3;
    doTowers(nDisks, 'A', 'B', 'C');
  }

  public static void doTowers(int topN, char from, char inter, char to) {
    if (topN == 1){
      System.out.println("Disk 1 from " + from + " to " + to);
    }else {
      doTowers(topN - 1, from, to, inter);
      System.out.println("Disk " + topN + " from " + from + " to " + to);
      doTowers(topN - 1, inter, from, to);
    }
  }
}

Результат:

Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C

Я не понимаю, как мы получаем:

Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A

Кто-нибудь может объяснить?

Спасибо.

18.09.2012

  • ключевой концепцией здесь является понимание рекурсивных вызовов, изменяющих аргументы ... 18.09.2012
  • Да, но я понимаю, как появился Диск 1 от A до C Диск 2 от A до B, но почему-то я не могу понять, откуда появился Диск 1 от C до B. Не могли бы вы объяснить мне поток? Я был бы очень признателен! 18.09.2012
  • Измените doTowers(nDisks, 'A', 'B', 'C'); на doTowers(nDisks, 'Left', 'Right', 'Middle'); и посмотрите, поможет ли это визуализировать. 18.09.2012
  • Проверьте эту визуализацию cs.cmu.edu/~cburch/survey/recurse /hanoiex.html 19.09.2012
  • Вот еще одна визуализация: jsfiddle.net/9ATNk/1 19.09.2012
  • вы должны проверить этот ответ в - Ханойская башня: рекурсивный алгоритм 06.10.2019

Ответы:


1

Перемещение башни N дисков с привязки A к C достигается перемещением башни N-1 (все диски, кроме последнего) из A в B, затем перемещением N-го диска из A в C и, наконец, перемещением башни, ранее перемещенной в B, от B к C. Это должно применяться каждый раз, когда башня с более чем одним диском перемещается, в случае башни с 1 диском вы просто перемещаете ее единственный диск.

07.12.2012

2

Если я не ошибаюсь, вы можете перемещать 1 диск на одну опору за каждый оборот, правильно? Итак, вы перемещаете первый диск с a на b, затем с b на c. Это 2 хода. Теперь мы можем переместить диск 2 из a в b. Теперь мы можем переместить диск 1 из c обратно в b. Прямо сейчас диск 3 находится на A, а диски 2 и 1 находятся на a. Теперь переместим диск 1 из a в b, затем в c. Нет, нам нужно расположить диски 1 и 2 на диске 3 в правильном порядке. Итак, мы очищаем диск 1, перемещая его из B в A. Это позволяет нам переместить диск 2 из B в C. Теперь мы закончим перемещением диска 1 из A в B, затем в C, и все готово.

Это ответ на ваш вопрос?

18.09.2012
  • Я понял всю работу ... но когда я пытаюсь рекурсивно разбить ее, все, что я получаю, это Диск 1 от A до C Диск 2 от A до B, Диск 2 от B до C Диск 1 от A до C. I Я почему-то не могу понять, как рекурсивная функция переместила Диск 1 с C на B Диск 3 с A на C Диск 1 с B на A :( 18.09.2012
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]