|
1 / 1 / 0
Регистрация: 16.09.2014
Сообщений: 36
|
|||||||||||
Не могу понять алгоритм Ханойской башни26.12.2015, 03:15. Показов 2783. Ответов 5
Метки нет (Все метки)
Всем привет, есть у кого время разжевать мне работу кода ?
Битый час сижу с дебагером отлаживаю по шагам ,но после этой строчки
0
|
|||||||||||
| 26.12.2015, 03:15 | |
|
Ответы с готовыми решениями:
5
Подготовить файл проверки знаний для учащихся к уроку по теме "Алгоритм переноса колец Ханойской башни" |
|
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
|
|
| 26.12.2015, 11:11 | |
|
n-1 кольцо кладете на вторую стойку ,затем n-ое на третью стойку ,затем те что на второй перекладываете на третью
0
|
|
|
1 / 1 / 0
Регистрация: 16.09.2014
Сообщений: 36
|
|
| 26.12.2015, 23:35 [ТС] | |
|
Я читал коменты в этой теме задолго до того как создать свою тему .Как играть в Ханойскую башню теоретически понятно ,но как это реализовать рекурсией загадка .
0
|
|
|
338 / 67 / 37
Регистрация: 22.12.2010
Сообщений: 138
|
||||||
| 27.12.2015, 08:14 | ||||||
Сообщение было отмечено Lars как решение
Решение
Lars,
Итак,
I. Вносим входные данные. В моём примере: Кол-во дисков = 3 Стержень, с которого требуется перенести кольца = 1 Стержень, на который требуется перенести кольца = 3 Соответственно, вспомогательным(свободным) стержнем является стержень под номером 2. II. Обращаемся в первый раз к функции hanoi_tower, передавая при этом следующие параметры (d, s, f, h) -> (3, 1, 3, 2) Сокращения (особое внимание обратите на то, как меняется порядок передачи параметров при различных вызовах функции) d-disk s-start f-final h-help Пойдём поэтапно: Проверяем условие, что кол-во дисков не равно 0 (d != 0) Оно выполняется. 1) Первым делом рекурсивно вызывается функция hanoi_tower с параметрами (d-1, s, h, f) -> (3-1, 1, 2, 3) 1.1) Обращаемся во второй раз к функции hanoi_tower с параметрами (d, s, f, h) -> (2, 1, 2, 3) Выполняется условие (d != 0) Вызывается функция hanoi_tower с параметрами (d-1, s, h, f) -> (2-1, 1, 3, 2) 1.1.1) Обращаемся во третий раз к функции hanoi_tower с параметрами (d, s, f, h) -> (1, 1, 3, 2) Выполняется условие (d != 0) Вызывается функция hanoi_tower с параметрами (d-1, s, h, f) -> (1-1, 1, 2, 3), которая в виду d = 1-1 = 0 закончит рекурсию. Переходим к cout << disk(d) << start(s) << final(f). Имеем: Диск(d) 1 переносим со стержня(s) 1 на стержень(f) 3 - Это шаг 1. После cout снова рекурсивно вызывается функция hanoi_tower уже с параметрами (d-1, h, f, s) -> -> (1-1, 2, 1, 3), которая в виду d = 1-1 = 0 закончит рекурсию. 1.1.2) На этапе 1.1 после обращения к функции hanoi_tower (1.1.1) выполняем cout << disk(d) << start(s) << final(f): Имеем: Диск(d) 2 переносим со стержня(s) 1 на стержень(f) 2 - Это шаг 2. 1.1.3) После cout (1.1.2), рекурсивно вызывается функция hanoi_tower с параметрами (d-1, s, f, h) -> (1, 3, 2, 1). Выполняется условие (d != 0) Вызывается функция hanoi_tower с параметрами (d-1, s, h, f) -> (1-1, 1, 3, 2), которая в виду d = 1-1 = 0 закончит рекурсию. 1.1.3.1) Переходим к cout после 1.1.3. Имеем: Диск(d) 1 переносим со стержня(s) 3 на стержень(f) 2 - Это шаг 3. 1.1.3.2) После cout (1.1.3.1) вызывается функция hanoi_tower с параметрами (d-1, h, f, s) -> (1-1, 1, 2, 3), которая в виду d = 1-1 = 0 закончит рекурсию. 2) Мы закончили с "первой" строчкой (она же этап "1") в условии if(d != 0). Переходим к строке с cout, вспоминая, что на этапе 1 hanoi_tower имела следующие параметры (d, s, f, h) -> (3, 1, 3, 2). Имеем: Диск(d) 3 переносим со стержня(s) 1 на стержень(f) 3 - Это шаг 4. 2.1) После строки cout (2) попадем на строку вызова функции hanoi_tower с параметрами (d-1, h, f, s) -> (3-1, 2, 3, 1). hanoi_tower примет за параметры (d, s, f, h) -> (2, 2, 3, 1) Снова проверка условия if(d != 0) даёт нам true. Идём далее. 2.1.1) Попадаем на строку вызова функции hanoi_tower с параметрами (d-1, s, h, f) -> (2-1, 2, 1, 3). Отправляемся ещё глубже. 2.1.1.1) Уже вызвана функция hanoi_tower с параметрами (d, s, f, h) -> (1, 2, 1, 3). Проверку if(d != 0) проходит. Вызывается функция hanoi_tower с параметрами (d-1, s, h, f) -> (1-1, 2, 3, 1), которая в виду d = 1-1 = 0 закончит рекурсию. 2.1.1.2) После завершения данной рекурсии попадаем на строку cout. Имеем: Диск(d) 1 переносим со стержня(s) 2 на стержень(f) 1 - Это шаг 5. 2.1.1.3) После cout (2.1.1.2) попадем на строку вызова функции hanoi_tower с параметрами (d-1, h, f, s) -> (1-1, 3, 1, 2), которая в виду d = 1-1 = 0 закончит рекурсию. 2.1.2) Возвращаемся на уровень повыше, он же этап 2.1. Рекурсия по "первой" строке закончилась. Переходим к cout. При этом помним, какие значения имели параметры имела наша функция на этапе 2.1. Имеем: Диск(d) 2 переносим со стержня(s) 2 на стержень(f) 3 - Это шаг 6. 2.1.3) Итак, этап 2.1 пройден, cout выведен. Попадаем на следующую строку, в которой в очередной раз вызывается функция hanoi_tower с передаваемыми параметрами (d-1, h, f, s) -> (2-1, 1, 3, 2) (см. этап 2.1, второе предложение). 2.1.3.1) Вызвана функция hanoi_tower с параметрами (d, s, f, h) -> (1, 1, 3, 2). Условие if(d != 0) срабатывает. Вызывается в предпоследний раз функция hanoi_tower с параметрами (d, s, h, f) -> (1-1, 1, 2, 3), которая в виду d = 1-1 = 0 закончит рекурсию. 2.1.3.2) Попадаем в строку с cout. Имеем: Диск(d) 1 переносим со стержня(s) 1 на стержень(f) 3 - Это шаг 7. 2.1.3.3) Переходим на строку, следующую за строкой с cout. Снова передаем параметры функции hanoi_tower и опять же завершаем рекурсии, так как d-1 = 1-1 = 0 (этап 2.1.3.1) finita la comedia
1
|
||||||
|
1 / 1 / 0
Регистрация: 16.09.2014
Сообщений: 36
|
|
| 27.12.2015, 15:33 [ТС] | |
|
Супер спасибо вам за объяснение ,я проникся в тему
0
|
|
| 27.12.2015, 15:33 | |
|
Помогаю со студенческими работами здесь
6
Визуализация Ханойской башни
итерация Ханойской башни Визуализация решения Ханойской башни Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|