powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / непонимание по ханойским башням
8 сообщений из 8, страница 1 из 1
непонимание по ханойским башням
    #39911948
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый всем день.
Помогите тупому. Нашел на просторах интернета решение задачи про ханойские башни. вот решение:

Переместить n-1 дисков с колышка 1 на колышек 2, используя колышек 3, как временное размещение.
Переместить последний наибольший диск с колышка 1 на колышек3.
Переместить n-1 дисков с колышка 2 на колышек 3, используя колышек 1, как временное размещение.

программа такая :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
     //программа Ханойские башни - алгоритм
    #include <iostream>
    using namespace std;
    //рекурсивная функция
    //m - число дисков, котоое нужно переместить
    //a - Колышек, на котором находятся диски
    //b - колышек, на который нужно переместить
    //c - колышек временного размещения
    void hanoy(int m, int a, int b, int c)
    {
        if(m==0) return;
        hanoy(m-1, a, c, b);
        cout<<a<<" => "<<b<<endl;
        hanoy(m-1, c, b, a);
    }

    void main()
    {
        int n = 3, x = 1, y = 2, z = 3;
        //необходимо переместить n дисков с 1 на 3 колышек, используя второй
        hanoy(n, x, z, y);
        cin.get();
        return;
    }



а теперь вопрос .
ведь программа не соответствует предложенному выше алгоритму ?
вот самая первая строчка в программе :
hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест.
а вот строка из алгоритма
Переместить n-1 дисков с колышка 1 на колышек 2, используя колышек 3, как временное размещение.
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912037
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест.
Если m это число дисков, то (m-1) — перенос одного диска, а не (m-1) диска. 😎
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912054
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis
andron81
hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест.
Если m это число дисков, то (m-1) — перенос одного диска, а не (m-1) диска. 😎


именно (m-1) дисков. это рекурсивная функция с постоянным уменьшением . перестановка одного диска это :
строка

Код: plaintext
1.
cout<<a<<" => "<<b<<endl;
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912082
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Z axis
пропущено...
Если m это число дисков, то (m-1) — перенос одного диска, а не (m-1) диска. 😎


именно (m-1) дисков. это рекурсивная функция с постоянным уменьшением .
И постоянной перестановкой последнего и предпоследнего аргументов. Так что твой вывод "hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест" только потому что b суётся третьим аргументом не факт что верный.
Посмотри на вывод кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <iostream>
using namespace std;
//рекурсивная функция
//m - число дисков, котоое нужно переместить
//a - Колышек, на котором находятся диски
//b - колышек, на который нужно переместить
//c - колышек временного размещения
void hanoy(int m, int a, int b, int c)
{
    int n = m;
    if(m==0) return;
    hanoy(m-1, a, c, b);
    if (n == 3) cout << endl;
    cout<<a<<" => "<<b<<endl;
    if (n == 3) cout << endl;
    hanoy(m-1, c, b, a);
}

int main()
{
    int n = 3, x = 1, y = 2, z = 3;
    //необходимо переместить n дисков с 1 на 3 колышек, используя второй
    hanoy(n, x, z, y);
}


и сравни перемещения со словесным алгоритмом.
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912824
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis
andron81
пропущено...


именно (m-1) дисков. это рекурсивная функция с постоянным уменьшением .
И постоянной перестановкой последнего и предпоследнего аргументов. Так что твой вывод "hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест" только потому что b суётся третьим аргументом не факт что верный.
Посмотри на вывод кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <iostream>
using namespace std;
//рекурсивная функция
//m - число дисков, котоое нужно переместить
//a - Колышек, на котором находятся диски
//b - колышек, на который нужно переместить
//c - колышек временного размещения
void hanoy(int m, int a, int b, int c)
{
    int n = m;
    if(m==0) return;
    hanoy(m-1, a, c, b);
    if (n == 3) cout << endl;
    cout<<a<<" => "<<b<<endl;
    if (n == 3) cout << endl;
    hanoy(m-1, c, b, a);
}

int main()
{
    int n = 3, x = 1, y = 2, z = 3;
    //необходимо переместить n дисков с 1 на 3 колышек, используя второй
    hanoy(n, x, z, y);
}


и сравни перемещения со словесным алгоритмом.


да согласен, пример запустил он показывает следование алгоритму . И Вы на вопрос ответили. но решение непонятно. где тут красота рекурсии ? как скажем вы с отличным опытом в программировании досекли , что расстановки параметров должны быть такие (a, c, b) , (a,b) (с,b,a) ? Вы правы, я руководствовался именно логикой порядка следования параметров .
То есть разбираем решение по моей логике это :
1) перемещаем (a,c,b, (n-1)) - с "1" на "3" (n-1) дисков,использовав "2" как вспомогательный . таким образом "2" - пустой.
2) a,b - перемещаем самый большой диск с "1" на "2"
3) перемещаем (c, b, a,(n-1)) - перемещаем c "3" на "2" (n-1) дисков, используя "1" как вспомогательный.

этот алгоритм не соответствует первому. ну да ладно.
А почему я не могу таким алгоритмом воспользоваться :
(a,b,c,(n-1))
(a,c)
(b,c,a,(n-1))

???
вот он уже не рабочий.
Т. е. само тело функции его выходит нельзя сопоставлять с алгоритмом ? что надо сделать , чтобы выстроить правильно параметры ?
может быть тупо выстроить дерево решений по алгоритму для 3 палок , 4 и таким образом расставить параметры ?
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912830
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
кстати есть ещё решение и оно рабочее. это вообще вынос мозга ))))

Код: plaintext
1.
2.
3.
4.
5.
    if (n <= 0) { return 0; }
    tryhanoi(a, c, b,n-1);
    printf("%d->%d\n", a,c);
    tryhanoi(b, a, c,n-1);
    return 0;


разберем при n=3.
Смотрите, мы
в первой строке из "1" штыка перемещаем 2 диска в "3" , используя "2" как вспомогательный. при этом тупо в 1-ом остается один самый большой диск.
а потом мы из "1" перемещаем этот большой диск на диск "3" , где диска 2 и они меньше по диаметру чем тот что перемещаем. а так нельзя ))))
ну а потом из штыка № "2" перемещаем в № "1" использовав вспомогательный "3".
Если первое решение ещё куда не шло, то это жесть ....

выходит словесный алгоритм совсем нельзя сопоставлять с решением , а именно с рекурсивной функцией.
а как тогда эти 2 решения найдены ???
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912937
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
вот самая первая строчка в программе :
hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест.
Изначально функция вызывается как hanoy(n, x, z, y)
Т.е. a == 1, b == 3, c== 2.
...
Рейтинг: 0 / 0
непонимание по ханойским башням
    #39912988
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis
andron81
вот самая первая строчка в программе :
hanoy(m-1, a, c, b); перенос (m-1) из a(1) на c(3) , использовав b(2) как вспомогательный шест.
Изначально функция вызывается как hanoy(n, x, z, y)
Т.е. a == 1, b == 3, c== 2.


а разобрался. спасибо. а тот пример №2 там параметры функции наоборот устроены.
то есть у нас с вами функция переносила с "а" на "b" и спользуя "c"
Код: plaintext
1.
void hanoy(int m, int a, int b, int c)



а в этом примере функция переносила с a на c используя b как вспомогательный.
Код: plaintext
1.
void hanoy(int m, int a, int b, int c)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / непонимание по ханойским башням
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]