Избегайте переполнения стека с помощью рекурсии - PullRequest
0 голосов
/ 08 апреля 2019

На самом деле я пишу программу для создания идеальных лабиринтов на C.

Я использую рекурсию для этого и получаю переполнение стека, когда генерирую слишком большие лабиринты.

static void fill_maze(int x, int y, bool **tab, dimensions_t dim)
{
    int *i;
    int d[4] = {0, 1, 2, 3};
    int xx;
    int yy;

    tab[y][x] = false;
    shuffle_array(d, 4);
    FOREACH(i, d) {
        xx = x + take_dirnum(*i, 0);
        yy = y + take_dirnum(*i, 1);
        if (is_map_valid(tab, xx, yy, dim)) {
            tab[AVG(y, yy)][AVG(x, xx)] = false;
            fill_maze(xx, yy, tab, dim);
        }
    }
}

Мой макрос foreach:

#define FOREACH(item, array) \
    for(int keep = 1, \
            count = 0,\
            size = sizeof (array) / sizeof *(array); \
        keep && count != size; \
        keep = !keep, count++) \
      for(item = (array) + count; keep; keep = !keep)

Я ищу способ перевести его в цикл или избежать переполнения стека, но с сохранением рекурсивности.Спасибо за помощь!

...