C:递归迭代函数

时间:2019-01-26 18:13:34

标签: c recursion iteration

我需要将此函数转换为迭代函数,但我能想到的只是递归,而当我想到迭代函数时,在我看来会变成一团糟(很多嵌套)。

      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 :(得分:0)

我只是偶然认识到该模式,所以我没有分析方法来展示如何将原始代码转换为该解决方案。我只是知道:

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' : ' ';
}

可以在Pascal’s triangle中看到该模式,对每个奇数条目使用D,对每个偶数条目使用空格。在Pascal的三角形中,第一行之后的每个条目都是位于其上方左右两侧的两个条目的总和。因此,即使且仅当以上两个条目具有相同的奇偶校验时,才如此。我们只需要考虑起点(i为零)和左边缘(j为零)。