我需要将此函数转换为迭代函数,但我能想到的只是递归,而当我想到迭代函数时,在我看来会变成一团糟(很多嵌套)。
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个正方形,不同的是,如果正方形是白色的,则保持白色。 我如何在不写混乱的情况下进行迭代?
答案 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
为零)。