递归实现Sierpinski三角形遇阻:无法完成完整绘制求助
嘿,我帮你排查下这个递归谢尔宾斯基三角形的问题,几个小细节导致它没法完整递归下去:
问题排查与修复方案
1. 错误用while循环替代递归终止条件
你的Triangle方法里用了while (dist >= 100),这会让代码在当前递归调用里死循环,而不是触发新的递归分支。递归逻辑应该用if判断终止条件——满足条件时执行递归逻辑,否则直接退出。
2. 顶点坐标处理冗余且错误
原始的xPos和yPos里第四个点是重复第一个点用来闭合多边形,但计算中点时你用到了这个重复的点(x3/y3),完全没必要。我们只需要处理三个核心顶点即可,闭合的事交给drawPolygon自动完成。
另外你创建的小三角形坐标有明显错误:比如xpoints长度是3,但ypoints是4,调用drawPolyline时会因数组长度不匹配导致绘制异常;而且小三角形的顶点对应关系不符合谢尔宾斯基的结构(应该是三个角落的小三角形,每个由大三角形的一个顶点+相邻两个中点组成)。
3. 递归调用的参数传递错误
你传给下一层递归的xpoints等数组结构不对,导致下一层无法正确计算边长和中点,递归自然没法继续深入。
修复后的完整代码
import javax.swing.*; import java.awt.*; public class recursiveTriangle18 extends JApplet { private final int APPLET_WIDTH = 800; private final int APPLET_HEIGHT = 800; // 只保留三个核心顶点,无需重复第一个点做闭合 private int[] xPos = {720, 80, 400}; private int[] yPos = {600, 600, 40}; public void init() { setBackground(Color.white); setSize(APPLET_WIDTH, APPLET_HEIGHT); } public void paint(Graphics page) { page.setColor(Color.BLUE); // 用drawPolygon自动闭合图形,更简洁 page.drawPolygon(xPos, yPos, xPos.length); Triangle(xPos, yPos, page); } public void Triangle(int[] xVertices, int[] yVertices, Graphics page) { // 提取三个顶点:A(右)、B(左)、C(上) int x0 = xVertices[0]; int y0 = yVertices[0]; int x1 = xVertices[1]; int y1 = yVertices[1]; int x2 = xVertices[2]; int y2 = yVertices[2]; // 计算底边AB的长度作为递归终止依据(选任意边都可以) double dist = Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)); // 递归终止:当边长小于100时停止绘制 if (dist < 100) { return; } // 计算三条边的中点 int midABx = (x0 + x1) / 2; int midABy = (y0 + y1) / 2; int midBCx = (x1 + x2) / 2; int midBCy = (y1 + y2) / 2; int midCAx = (x2 + x0) / 2; int midCAy = (y2 + y0) / 2; // 绘制中点连线,分隔出中间的空白三角形 page.drawLine(midABx, midABy, midBCx, midBCy); page.drawLine(midBCx, midBCy, midCAx, midCAy); page.drawLine(midCAx, midCAy, midABx, midABy); // 递归绘制三个角落的小三角形 // 1. 右下角三角形:A + AB中点 + CA中点 Triangle(new int[]{x0, midABx, midCAx}, new int[]{y0, midABy, midCAy}, page); // 2. 左下角三角形:B + AB中点 + BC中点 Triangle(new int[]{x1, midABx, midBCx}, new int[]{y1, midABy, midBCy}, page); // 3. 顶部三角形:C + BC中点 + CA中点 Triangle(new int[]{x2, midBCx, midCAx}, new int[]{y2, midBCy, midCAy}, page); } }
关键修复点说明
- 把
while改成if判断终止条件,确保递归能逐层深入,而非在当前层循环 - 简化顶点数组,用
drawPolygon自动闭合图形,避免冗余的坐标处理 - 正确计算三条边的中点,通过连线分隔出谢尔宾斯基三角形的标志性空白区域
- 递归调用时传递正确的小三角形顶点,保证每一层递归都能正确计算边长
- 移除了未使用的
flag参数,精简代码结构
修改后递归就能正常逐层执行,直到边长小于100时停止,完整绘制出谢尔宾斯基三角形啦。
内容的提问来源于stack exchange,提问作者user9767134
相关产品推荐
相关产品推荐

