Есть ли способ вывести общее количество шагов из оператора if? - PullRequest
0 голосов
/ 04 октября 2019

Я пишу код для Ханойских Башен для решения домашней задачи в моем классе от вступления к букве C. У меня есть действующая программа, но в качестве дополнения я хотел бы, чтобы код распечатывал количество выполненных шагов, т. Е. «Общее количество шагов - 31». Затем я хочу сравнить их с теоретическим количеством шагов (например, steps = (2^n)-1, где n - количество дисков) и быть в состоянии убедиться, что программа работает правильно для больших значений n.

До сих пор я был в состоянии реализовать код для распечатки ожидаемого количества необходимых шагов, но я не уверен, как поступить в консоль, чтобы распечатать фактическое количество шагов.

void towers(int, char, char, char);
int main()
{
    int n;
    printf("Number of disks:");
    scanf("%d", &n);
    int result = (pow(2,n)-1);
    printf("\nExpected number of moves required is %d", result);
    towers(n, 'A', 'C', 'B'); //moving n disks from A to C using B as the intermediate
    return 0;
}

result вызывает функцию power и возвращается к ожидаемому количеству шагов перед запуском функции Towers.

void towers(int n, char from_peg, char to_peg, char other_peg)
{
    if (n == 1) //breaking condition
    {
        printf("\n Move disk 1 from peg %c to peg %c", from_peg, to_peg);
        return;
    }
    towers(n-1, from_peg, other_peg, to_peg); //moving n-1 disks from A to B using C as the intermediate
    printf("\n Move disk %d from peg %c to peg %c", n, from_peg, to_peg);
    towers(n-1,other_peg,to_peg,from_peg); //moving n-1 disks from B to C using A as the intermediate
}

Цикл возвращает решение для головоломки башни, печатая движение каждый раз.

В идеале я хотел бы, чтобы после того, как цикл полностью указывал «Общее количество требуемых ходов (количество шагов)», нужно выполнить несколько строк, а затем сравнить ожидаемый результат с фактическим результатом (т.е. expected step number == actual step numberэто правда).

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Один из способов сделать это - заставить towers() вернуть количество выполненных шагов:

int towers(int n, char from_peg, char to_peg, char other_peg)
{
    int steps = 0;

    if (n > 0)
    {
        steps += towers(n-1, from_peg, other_peg, to_peg); //moving n-1 disks from A to B using C as the intermediate
        steps += 1;
        printf("\n Move disk %d from peg %c to peg %c", n, from_peg, to_peg);
        steps += towers(n-1,other_peg,to_peg,from_peg); //moving n-1 disks from B to C using A as the intermediate
    }
    return steps;
}

Использование:

int actual = towers(n, 'A', 'C', 'B');
printf("\nActual number of moves used is %d", actual);

(я продолжал использовать \n в начале распечатки, но в конце ставить более условно!)

1 голос
/ 04 октября 2019

У вас есть несколько вариантов. Самый простой - просто объявить глобальную переменную, инициализировать ее нулем, а затем увеличивать каждый шаг. После этого вы просто печатаете его.

Если вы хотите избежать глобальных переменных, что в целом хорошо, вы можете передать переменную через указатель. Примерно так:

void towers(int n, char from_peg, char to_peg, char other_peg, int * no_steps)
{
    (*no_steps)++;
    ...

Еще один способ избежать глобальных изменений - использовать статические.

int towers(int n, char from_peg, char to_peg, char other_peg)
{
    static int no_steps = 0;
    no_steps++;
    ...
    return no_steps;
...