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函数绘制图案,最后打印网格。
  • 打印逻辑:遍历二维数组cc[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)演示递归步骤:

  1. 初始调用draw(4, 0, 0),将 4×4 正方形分成 4 个 2×2 的子正方形(half=2)。
  2. 只对 3 个子正方形递归:
    • 左下子正方形(draw(2, 2, 0)
    • 右上子正方形(draw(2, 0, 2)
    • 右下子正方形(draw(2, 2, 2)
  3. 每个 2×2 的子正方形再分割为 4 个 1×1 的子正方形,同样只对 3 个递归,最终标记*

最终 4×4 的输出图案为:

plaintext

...*
..**
.*.*
****

四、总结

这段代码通过递归分形的思想,每次将正方形分割为 4 个象限,只在左下、右上、右下三个象限继续绘制,左上象限留白,最终形成自相似的图案。当 n=4 时,会输出 16×16 的类似图案,本质是这种递归规则的放大版。

核心规律:每次分割后,左上象限不画,其余三个象限重复相同规则

posted @ 2025-08-05 19:50  kkman2000  阅读(7)  评论(0)    收藏  举报