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

递归实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:11