C : Recursive Function to Iterative

标签 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 个方格,但如果该方格是白色的,则它仍然是白色的。 我怎样才能让它迭代而不写得一团糟?

最佳答案

我只是碰巧认识了这个模式,所以我没有分析方法来展示如何将原始代码转换为这个解决方案。我才知道:

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,对每个偶数条目使用空格。在帕斯卡三角形中,第一行之后的每个条目都是其上方左侧和右侧两个条目的总和。因此,即使且仅当上面的两个条目具有相同的奇偶校验时。我们只需要考虑开始(i 为零)和左边缘(j 为零)。

关于C : Recursive Function to Iterative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54381288/

相关文章:

c - 函数声明顺序在 C 语言中很重要,还是我做错了什么?

javascript - 使用相同的代码迭代并访问数组和对象元素

delphi - 递归遍历 TreeView 中的节点?

c++ - Qt C++ QDomDocument,递归迭代 XML 数据,检索没有子数据的文本元素

recursion - 线性递归与线性迭代过程 (LISP)

c - 如何检索存储在无符号变量中的有符号值

c - 线程只会对数组的第一个分区进行排序(冒泡排序,Pthread)

c - 快速乘法模 2^16 + 1

python - 寻找最接近给定值的路径旅行成本

recursion - 在 Rust 中编写定点函数