如何仅用单参数递归实现金字塔绘制(无循环)
无循环实现金字塔绘制方案
核心思路
用递归替代循环实现重复绘制逻辑,分为两层递归:一层遍历所有行(从底部到顶部),另一层遍历当前行内需要涂黑的像素点。
实现代码(基于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); }
关键逻辑说明
留白计算规则
对于当前行currentY(画布原点(0,0)为顶部,canvasHeight-1为底部),首尾留白数为(canvasHeight-1) - currentY:- 底部行(
currentY=canvasHeight-1):留白数为0,整行涂黑 - 倒数第二行(
currentY=canvasHeight-2):留白数为1,仅x=1到x=canvasWidth-2区域涂黑 - 以此类推,顶部行留白数最大,仅中间区域(若存在)涂黑
- 底部行(
递归终止条件
- 行递归:当
currentY < 0时,说明所有行已处理完成,停止递归 - 像素递归:当
currentX > endX时,说明当前行的所有需要涂黑的像素已绘制完成,停止递归
- 行递归:当
辅助函数适配
假设vertical_line函数的参数为(Canvas c, int x, int yStart, int yEnd),用于绘制x列上从yStart到yEnd的竖线。当yStart和yEnd取相同值时,即可实现单个像素点的绘制,完美适配行内像素的填充需求。
内容的提问来源于stack exchange,提问作者weito
相关产品推荐
相关产品推荐

