C: рекурсивная функция в итеративную - PullRequest
0 голосов
/ 26 января 2019

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

      void FrattaleRicorsivo(char scacchiera[][32], int n, int m, bool black)
    {
      int mediano;
      //Soluzione del caso di base.
      if (m == 0)
      {
          return;
      }
      else
      {
          m--;
          mediano = (n - 1)/2;
          if (black)
          {
              for (int i = 0; i < n; i++)
              {
                  for (int j = 0; j < n; j++)
                  {
                      scacchiera[i][j] = 'D';
                  }
              }
          FrattaleRicorsivo(&scacchiera[0][0], mediano + 1, m, true);
          FrattaleRicorsivo(&scacchiera[0][mediano + 1], n - mediano - 1, m, false);
          FrattaleRicorsivo(&scacchiera[mediano + 1][0], mediano + 1, m, true);
          FrattaleRicorsivo(&scacchiera[mediano + 1][mediano + 1], n - mediano - 1, m, true);
          }
          else
          {
              for (int i = 0; i < n; i++)
              {
                  for (int j = 0; j < n; j++)
                  {
                      scacchiera[i][j] = ' ';
                  }
              }
          }
      }
    }
void main()
{
    int n = 32;
    char scacchiera[n][n];
    int i, j;
    for (i = 0; i < n; i++)
    {
    for (j = 0; j < n; j++)
    {
        scacchiera[i][j] = 'X';
    }
}
FrattaleRicorsivo(scacchiera, n, 6, true);

}

Двумерный массив начинается с черного цвета, он же обозначается буквой «X».По сути, эта функция делит двумерный массив на 4 квадрата, и верхний правый квадрат становится «белым», а остальные имеют D и отмечены черным.Затем он разделяет каждый из этих квадратов на еще 4 квадрата с тем же правилом, за исключением того факта, что если квадрат белый, он остается белым.Как бы я сделал это итеративно без написания путаницы?

1 Ответ

0 голосов
/ 26 января 2019

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

static void Fill(size_t n, char (*A)[n])
{
    for (size_t i = 0; i < n; ++i)
    for (size_t j = 0; j < n; ++j)
        A[i][j] = j == 0 || i != 0 && A[i-1][j-1] != A[i-1][j] ? 'D' : ' ';
}

Шаблон виден в Треугольник Паскаля , где D используется для каждой нечетной записи и пробел для каждой четной записи В треугольнике Паскаля каждая запись после первой строки является суммой двух записей слева и справа над ней. Так что это даже если и только если две записи выше имеют одинаковый паритет. Нам просто нужно учесть начало (i - ноль) и левый край (j - ноль).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...