Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
#1

Ханойская башня и "любимая" рекурсия - C++

04.11.2015, 14:34. Просмотров 2621. Ответов 28
Метки нет (Все метки)

Здравствуйте.

Нашёл здесь на форуме код, для решения данной задачи, но самому мало понятно, что и как, может кто подробно разъяснить?
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
34
35
void Hanoi(int r, int b, int e)
{
    int c; // как я понял, колышек для временного размещения колец.
 
    // Находим колышек, на котором будут временно расположены кольца.
    if ((b == 1 && e == 2) || (b == 2 && e == 1)) c = 3;
    else
        if ((b == 1 && e == 3) || (b == 3 && e == 1)) c = 2;
        else
            if ((b == 2 && e == 3) || (b == 3 && e == 2)) c = 1;
 
    // пока r > 1 идёт рекурсия.
    if (r > 1)
    {
        // а вот этот блок я вообще не могу понять...
        Hanoi(r - 1, b, c);
        std::cout << b << " -> " << e << std::endl;
        Hanoi(r - 1, c, e);
    }
    // основной случай, рекурсии кердык.
    else
        std::cout << b << " -> " << e << std::endl;
}
 
int main()
{
    int _rings;
 
    std::cout << "Type number of rings: ";
    std::cin >> _rings;
 
    Hanoi(_rings, 1, 3);
 
    system("pause");
}

http://www.cyberforum.ru/cpp-beginners/thread1615551.html

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2015, 14:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ханойская башня и "любимая" рекурсия (C++):

Нужна рабочая программа "Ханойская башня" в консоли
Нужна рабочая программа &quot;Ханойская башня&quot; в консоле: Вводишь количество колец,...

Ханойская башня. Рекурсия
Здравствуйте. Это одно из решений о ханойской башне. Я не могу понять область...

Ханойская башня
Ханойская башня является одной из популярных головоломок XIX века. Даны три...

Ханойская башня
Здравствуйте! Скажите пожалуйста как можно реализовать решение для ханойской...

Ханойская башня
Легенда гласит, что, в Великом храме города Бенарас, под собором, отмечающим...

28
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
04.11.2015, 18:32  [ТС] #21
Цитата Сообщение от _Ivana Посмотреть сообщение
Давай, пока горячо - лепи сюда рекурсивный факториал, раз ты его разобрал. И подкрути вывод аргумента.
Ну разобрать то разобрал, правда давненько это было
Чуть позже отпишу.

Добавлено через 10 минут
_Ivana, оно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int fact(int n)
{
    if (n <= 1)
        return 1;
    else
        cout << n << endl;
        return n * fact(n - 1);
        
}
 
int main()
{
    int number = 5;
 
    cout << fact(number) << endl;
 
    system("pause");
}
0
_Ivana
3232 / 1860 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
04.11.2015, 18:33 #22
Оно. Видишь что выводит? А теперь сделай в ветке иначе сначала расчет результата в переменную, потом вывод аргумента, а потом возврат результата.
0
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
04.11.2015, 18:36  [ТС] #23
Я просто помню, как это делается, даже в тетради схемку делал, но вот так, с ходу в уме представить в уме, что там происходит не получается.

Добавлено через 1 минуту
Забыл скобки поставить, а вывод вроде нормальный..
0
_Ivana
3232 / 1860 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
04.11.2015, 18:38 #24
А теперь сделай свой факториал void и ничего не возвращай, а вывод аргумента оставь. И с Фибоначчами так тоже попробуй - будет еще интереснее. И до ханойских башен останется полшага.
0
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
04.11.2015, 18:51  [ТС] #25
Цитата Сообщение от _Ivana Посмотреть сообщение
А теперь сделай в ветке иначе сначала расчет результата в переменную, потом вывод аргумента, а потом возврат результата.
C++
1
2
3
4
5
6
7
8
9
10
11
int fact(int n)
{
    if (n <= 1)
        return 1;
    else
    {
        x = n * fact(n - 1);
        cout << "Arg: " << n << endl;
        return n * fact(n - 1);
    }
}
Где-то накосячил или не так Вас понял. Вывод кривой.
0
_Ivana
3232 / 1860 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
04.11.2015, 18:53 #26
Ну почему же кривой - ровно как и заказывал. И это кстати очень похоже на твои башни - вызов / вывод / вызов. Хотя я имел в виду конечно один вызов до вывода.
0
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
04.11.2015, 18:59  [ТС] #27
Вообще бред какой-то написал...

Добавлено через 20 секунд
Сейчас подробнее разберу вывод..

Добавлено через 4 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Хотя я имел в виду конечно один вызов до вывода.
А не подскажете как реализуется только лишь один вызов?
0
_Ivana
3232 / 1860 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
04.11.2015, 19:02 #28
Ну ты х зачем считал? Причем как глобальную переменную, которая уже объявлена и типизирована выше, но это детали. Локальной ее сделай и возвращай после цаута.
0
kalonord
28 / 28 / 5
Регистрация: 27.01.2014
Сообщений: 783
04.11.2015, 19:11  [ТС] #29
Цитата Сообщение от _Ivana Посмотреть сообщение
Локальной ее сделай и возвращай после цаута.
C++
1
2
3
4
5
6
7
8
 else
    {
        cout << "Arg: " << n << endl;
 
        int x = n * fact(n - 1);
 
        return n * fact(n - 1);
    }
Правильно? Если нет, извините, я просто таким родился
0
04.11.2015, 19:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2015, 19:11
Привет! Вот еще темы с решениями:

Ханойская башня
Все вы видели башню Ханоя(если нет, то есть в гугл :D ) . У вас есть 3 столпа...

Ханойская башня
23. Написать программу, которая печатает последовательность действий (в виде...

Ханойская башня
Добрый день! Помогите решить задачку про ханойскую башню. Надо написать...

Ханойская башня
Использование переборных методов (разработка программ решения задачи «Ханойская...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru