Может кто-нибудь проследить эту программу, чтобы помочь мне лучше понять, как работает рекурсия - PullRequest
0 голосов
/ 04 декабря 2018

Программа решает головоломку Ханойская башня.Задача головоломки - переместить всю стопку дисков в другой стержень, следуя следующим простым правилам:

Одновременно можно перемещать только один диск.Каждый ход состоит в том, чтобы взять верхний диск из одной стопки и поместить его поверх другой стопки или на пустой стержень.Нельзя размещать диск большего размера поверх диска меньшего размера.С 3 дисками головоломка может быть решена за 7 ходов.Минимальное количество ходов, необходимое для решения головоломки Ханойской башни, составляет 2 ^ n - 1, где n - количество дисков.

#include <stdio.h>
void tower(int n, char start, char end, char help)
{
    if (n == 0)
    {
        return;
    }
    tower(n - 1, start, help, end);
    printf("\nDisk %d has been moved from tower %c to tower %c", n, start, 
    end);
    tower(n - 1, help, end, start);
}

int main()
{
    tower(3, 'A', 'C', 'B');
    return 0;
}`

1 Ответ

0 голосов
/ 04 декабря 2018

Во многих средах, работающих через отладчик, просто недоступно.В частности, встроенные системы или задания, которые выполняются в течение N дней на производстве до возникновения ошибки.

В этих сценариях ведение журнала потока программы с помощью простого printf() илиболее сложная функция ведения журнала может быть одним из единственных способов выяснить, что произошло.

Аналогично отслеживанию рекурсивного потока выполнения, просто добавьте печать в свою функцию:

void tower(int n, char start, char end, char help)
{
    printf("tower(n=%d, start=%c, end=%c, help=%c)\n", n, start, end, help);
    ...

Предоставление:

tower(n=3, start=A, end=C, help=B)
tower(n=2, start=A, end=B, help=C)
tower(n=1, start=A, end=C, help=B)
tower(n=0, start=A, end=B, help=C)
Disk 1 has been moved from tower A to tower C
tower(n=0, start=B, end=C, help=A)
Disk 2 has been moved from tower A to tower B
tower(n=1, start=C, end=B, help=A)
tower(n=0, start=C, end=A, help=B)
Disk 1 has been moved from tower C to tower B
tower(n=0, start=A, end=B, help=C)
Disk 3 has been moved from tower A to tower C
tower(n=2, start=B, end=C, help=A)
tower(n=1, start=B, end=A, help=C)
tower(n=0, start=B, end=C, help=A)
Disk 1 has been moved from tower B to tower A
tower(n=0, start=C, end=A, help=B)
Disk 2 has been moved from tower B to tower C
tower(n=1, start=A, end=C, help=B)
tower(n=0, start=A, end=B, help=C)
Disk 1 has been moved from tower A to tower C
tower(n=0, start=B, end=C, help=A)

Есть также удобные макросы компилятора __FILE__, __FUNCTION__ и __LINE__ (и еще пара, зависит от вашего компилятора).Которые могут быть встроены в операторы log / print:

printf( "Something eldritch happened in %s at %s:%d\n", __FUNCTION__, __FILE__, __LINE__ );
...