You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用单参数递归实现金字塔绘制(无循环)

无循环实现金字塔绘制方案

核心思路

用递归替代循环实现重复绘制逻辑,分为两层递归:一层遍历所有行(从底部到顶部),另一层遍历当前行内需要涂黑的像素点。

实现代码(基于Canvas框架)

Canvas pyramid(Canvas c) {
    int canvasHeight = c.getHeight();
    int canvasWidth = c.getWidth();
    
    // 从底部行开始递归绘制
    drawRow(c, canvasHeight - 1, canvasWidth);
    return c;
}

// 递归处理单一行的绘制
private void drawRow(Canvas c, int currentY, int canvasWidth) {
    // 终止条件:已处理完所有顶部行
    if (currentY < 0) return;
    
    // 计算当前行的首尾留白数
    int offset = (c.getHeight() - 1) - currentY;
    int startX = offset;
    int endX = canvasWidth - 1 - offset;
    
    // 递归绘制当前行的每个像素
    drawPixelInRow(c, currentY, startX, endX);
    
    // 递归绘制上一行
    drawRow(c, currentY - 1, canvasWidth);
}

// 递归绘制当前行内的单个像素
private void drawPixelInRow(Canvas c, int y, int currentX, int endX) {
    // 终止条件:已处理完当前行的所有像素
    if (currentX > endX) return;
    
    // 调用辅助函数绘制单个像素(假设vertical_line支持绘制单个点:x固定,y起始=结束)
    vertical_line(c, currentX, y, y);
    
    // 递归绘制下一个像素
    drawPixelInRow(c, y, currentX + 1, endX);
}

关键逻辑说明

  1. 留白计算规则
    对于当前行currentY(画布原点(0,0)为顶部,canvasHeight-1为底部),首尾留白数为(canvasHeight-1) - currentY:

    • 底部行(currentY=canvasHeight-1):留白数为0,整行涂黑
    • 倒数第二行(currentY=canvasHeight-2):留白数为1,仅x=1到x=canvasWidth-2区域涂黑
    • 以此类推,顶部行留白数最大,仅中间区域(若存在)涂黑
  2. 递归终止条件

    • 行递归:当currentY < 0时,说明所有行已处理完成,停止递归
    • 像素递归:当currentX > endX时,说明当前行的所有需要涂黑的像素已绘制完成,停止递归
  3. 辅助函数适配
    假设vertical_line函数的参数为(Canvas c, int x, int yStart, int yEnd),用于绘制x列上从yStart到yEnd的竖线。当yStart和yEnd取相同值时,即可实现单个像素点的绘制,完美适配行内像素的填充需求。

内容的提问来源于stack exchange,提问作者weito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:56:09