python递归分析
#include <bits/stdc++.h>
using namespace std;
const int max_size = 64;
bool c[max_size][max_size] = {false};
void draw(int size, int x, int y) {
if (size == 1) {
c[x][y] = true;
} else {
int half = size / 2;
draw(half, x + half, y);
draw(half, x, y + half);
draw(half, x + half, y + half);
}
}
void print(int n) {
int length = 1 << n;
draw(length, 0, 0);
for (int x = 0; x < length; ++x) {
for (int y = 0; y < length; ++y) {
if (c[x][y])
std::cout << '*';
else
std::cout << '.';
}
std::cout << "\n";
}
}
int main(){
print(4);
}
这段代码的核心是通过递归分形的方式,绘制一个特定规律的 2ⁿ×2ⁿ网格图形。我们可以从「功能拆解」和「递归逻辑」两方面快速理解:
一、功能总览
代码最终会输出一个边长为2ⁿ(n 是 print 函数的参数,这里 main 函数传入 4,所以是 16×16)的网格,网格中用*和.组成特定图案。规律是:通过递归将网格不断分割为更小的子网格,只在特定子网格中标记*。
二、核心函数拆解
1. print(n)函数
- 作用:控制整体流程,先计算网格边长(
length = 1 << n,即 2ⁿ),再调用draw函数绘制图案,最后打印网格。 - 打印逻辑:遍历二维数组
c,c[x][y] = true时输出*,否则输出.。
2. draw(size, x, y)函数(核心递归逻辑)
这是实现分形图案的关键,作用是在以(x,y)为左上角、边长为size的正方形区域内,按照规则标记*。
-
递归终止条件:当
size = 1(最小的 1×1 正方形)时,直接将c[x][y]标记为true(即这个位置是*)。 -
递归分割逻辑:当
size > 1时,将当前正方形分成 4 个等大的子正方形(边长为size/2),然后只对其中 3 个子正方形递归绘制,左上角的子正方形不绘制(保持.)。具体递归的 3 个子正方形位置:
- 左下子正方形:
draw(half, x + half, y)(左上角坐标(x+half, y)) - 右上子正方形:
draw(half, x, y + half)(左上角坐标(x, y+half)) - 右下子正方形:
draw(half, x + half, y + half)(左上角坐标(x+half, y+half))
- 左下子正方形:
三、递归过程示例(以 n=2 为例,边长 = 4)
为了直观理解,我们用小尺寸(4×4)演示递归步骤:
- 初始调用
draw(4, 0, 0),将 4×4 正方形分成 4 个 2×2 的子正方形(half=2)。 - 只对 3 个子正方形递归:
- 左下子正方形(
draw(2, 2, 0)) - 右上子正方形(
draw(2, 0, 2)) - 右下子正方形(
draw(2, 2, 2))
- 左下子正方形(
- 每个 2×2 的子正方形再分割为 4 个 1×1 的子正方形,同样只对 3 个递归,最终标记
*。
最终 4×4 的输出图案为:
plaintext
...*
..**
.*.*
****
四、总结
这段代码通过递归分形的思想,每次将正方形分割为 4 个象限,只在左下、右上、右下三个象限继续绘制,左上象限留白,最终形成自相似的图案。当 n=4 时,会输出 16×16 的类似图案,本质是这种递归规则的放大版。
核心规律:每次分割后,左上象限不画,其余三个象限重复相同规则。

浙公网安备 33010602011771号