Форум программистов, компьютерный форум CyberForum.ru

Ханойские башни, объясните принцип работы! - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
24.02.2012, 08:23     Ханойские башни, объясните принцип работы! #1
Можете мне "расписать" все что происходит в этом коде, плюс отдельные вопросы в "комментариях", так что бы я сам смог это объяснить если меня спросят!

Начальный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Ханойские башни
#include <iostream>
 
using namespace std;
 
void hanoi_towers(int quantity, int from, int to, int buf_peg)   //quantity-число колец, from-начальное положение колец(1-3),to-конечное положение колец(1-3)
{                                                         //buf_peg - промежуточный колышек(1-3)
        if (quantity != 0)
        {
                hanoi_towers(quantity-1, from, buf_peg, to);
 
                cout << from << " -> " << to << endl;
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
 
int main()
{
        setlocale(LC_ALL,"rus");
        int start_peg, destination_peg, buffer_peg, plate_quantity;
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg);
return 0;
}
код с вопросами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
void hanoi_towers(int quantity, int from, int to, int buf_peg)   //хотелось бы подробно узнать о том что происходит здесь, ка и каким образом это все пишется в void?  Что такое int from и int to, и чем оно является и их так сказать "тип" (включая int quantity и  int buf_peg)
{                                                         
        if (quantity != 0)
        {
                hanoi_towers(quantity-1, from, buf_peg, to); // Объясните что происходит внутри этих фигурных скобок? 
 
                cout << from << " -> " << to << endl;
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
 
int main()
{
        setlocale(LC_ALL,"rus");
        int start_peg, destination_peg, buffer_peg, plate_quantity;// Тут задаются переменные с помощью которых все будет выводится на экран?
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg); // Что происходит здесь? 
return 0;
}
Добавлено через 13 часов 31 минуту
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2012, 08:23     Ханойские башни, объясните принцип работы!
Посмотрите здесь:

объясните принцип работы цикла : ? C++
Ханойские башни C++
Односвязные списки. Объясните принцип работы. C++
C++ Объясните, пожалуйста, принцип работы.
Ханойские башни C++
C++ Ханойские башни
C++ Объясните принцип работы программы
Объясните принцип работы программы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikola-BLR
42 / 42 / 3
Регистрация: 27.12.2011
Сообщений: 54
25.02.2012, 03:45     Ханойские башни, объясните принцип работы! #2
Ханойская башня является одной из популярных головоломок XIX века. Даны три стержня, на один из которых нанизаны N колец, причем кольца отличаются размером и лежат меньшее на большем. Задача состоит в том, чтобы перенести пирамиду из N колец за наименьшее число ходов. За один раз разрешается переносить только одно кольцо, причём нельзя класть большее кольцо на меньшее.
Количество перекладываний в зависимости от количества колец вычисляется по формуле 2^n − 1 (т.е. большое число дисков не вводите, т.к. решение потребует кучу времени).
В информатике задачи, основанные на легенде о Ханойской башне, часто рассматривают в качестве примера использования рекурсивных алгоритмов и преобразования их к не рекурсивным.
Рекурсия — процесс повторения чего-либо самоподобным способом (в данной программе функция hanoi_towers вызывает саму себя, вновь вызванная hanoi_towers вызывает саму себя и т.д.)
Тип void -пустой, т.к. hanoi_towers не возвращает в main никаких значений, она лишь печатает текст типа
1 -> 2
1 -> 3
2 -> 1
и т.д. Это наши ходы, показывающие с какого стержня на какой мы перекладываем диск.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()//отсюда начинается выполнение программы
{
        setlocale(LC_ALL,"rus");//вывод кириллицы не кракозябрами
        int start_peg, destination_peg, buffer_peg, plate_quantity;//Объявление переменных. Мы сообщаем, что будем использовать 4 переменных целочисленного типа. Под них выделяется память.
        cout << "Номер первого столбика:" << endl;
        cin  >> start_peg;//Инициализация переменной. С клавиатуры вводим значение и присваиваем его переменной start_peg (номер начального столбика)
        cout << "Номер конечного столбика:" << endl;
        cin  >> destination_peg;//С клавиатуры вводим значение и присваиваем его destination_peg
        cout << "Номер промежуточного столбика:" << endl;
        cin  >> buffer_peg;//С клавиатуры вводим значение и присваиваем его buffer_peg
        cout << "Количество дисков:" << endl;
        cin  >> plate_quantity;//С клавиатуры вводим значение и присваиваем его plate_quantity
 
        hanoi_towers(plate_quantity, start_peg, destination_peg, buffer_peg); //вызываем функцию hanoi_towers и передаём ей параметры plate_quantity(Количество дисков), start_peg(Номер первого столбика), destination_peg(Номер конечного столбика), buffer_peg(Номер промежуточного столбика)
return 0;
Сама функция описана выше main(), но начинает работать лишь тогда, когда мы её вызвали из main()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void hanoi_towers(int quantity, int from, int to, int buf_peg)/*мы только что из main() прислали сюда 4 переменных и в теле этой функции
новым переменным целочисленного типа quantity, from, to, buf_peg присваиваем присланные значения переменных
plate_quantity, start_peg, destination_peg, buffer_peg.
quantity(количество дисков), from(Номер первого столбика), to(номер последнего), buf_peg(номер среднего)*/
{                                                         
        if (quantity != 0)//пока кол-во дисков не равно 0
        {
                hanoi_towers(quantity-1, from, buf_peg, to);/*рекурсия, т.е. мы снова вызываем эту же функцию и передаём ей 4 переменных, но количество дисков уже уменьшаем на один.
                Чуть ниже второй вызов, но там, обратите внимание, переменные передаются в другом порядке, т.е. там мы перекладываем диски на другие столбцы*/
 
                cout << from << " -> " << to << endl;//выводим текстовое сообщение, которое нам показывает с какого на какой столбик мы переложили диск
 
                hanoi_towers(quantity-1, buf_peg, to, from);
        }
}
каким образом это все пишется в void
"Это всё", а точнее наши 4 значения переменных, которые мы пересылаем из функции в функцию и потихоньку меняем, в void не пишутся. Они "пишутся" в quantity, from, to, buf_peg, которые создаются каждый раз во вновь вызванной функции. void - это тип значения, которое возвращает сама функция hanoi_towers по завершении. Но она выводит только текст и ничего не возвращает, поэтому используется пустой тип void.
comalex90
7 / 7 / 1
Регистрация: 28.01.2011
Сообщений: 33
25.02.2012, 16:27     Ханойские башни, объясните принцип работы! #3
Может не в тему ,но посмотри
http://www.youtube.com/watch?v=vrVJNPMjBDA
Yandex
Объявления
25.02.2012, 16:27     Ханойские башни, объясните принцип работы!
Ответ Создать тему
Опции темы

Текущее время: 15:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru