我需要将此函数转换为迭代函数,但我能想到的只是递归,当我想到迭代时,在我看来它会变得一团糟(又名许多嵌套)...
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/