你将如何在C中生成一个Sierpinski三角形(递归)

时间:2015-10-15 05:45:06

标签: c recursion fractals

我想知道如何在C中递归地生成一定深度的Sierpinski三角形。

我编写了这个函数,用于从顶点的坐标(x,y)生成一个由*组成的高度为h的三角形。

void triangle(char display[100][100],int x, int y, int h) {

    for (int row = y; row<=h-1+y; row++) {
        for (int column = x; column<=2*(row+1-y)+x-2; column++) {
            display[row][column-(row+1-y)+1] = '*';
        }
    }

    for (int i = 0 ; i<100 ; i++) {
        for (int j = 0; j<100; j++) {
            if (display[i][j]=='\0')
                display[i][j]=' ';
        }
    }



}

使用此代码,我可以手动生成&#34;谢尔宾斯基三角。但是我想以递归的方式做任何深度和高度(高度可以被2 ^(深度)整除)。

int main()
{
    char display[100][100] = { {0} };

    triangle(display, 20, 0, 5);

    triangle(display, 15, 5, 5);
    triangle(display, 25, 5, 5);

    triangle(display, 10, 10, 5);
    triangle(display, 30, 10, 5);

    triangle(display,  5, 15, 5);
    triangle(display, 15, 15, 5);
    triangle(display, 25, 15, 5);
    triangle(display, 35, 15, 5);


    for (int i=0 ; i<100; i++) {
        printf("\n");
        for (int j=0; j<100; j++) {
            printf("%c", display[i][j]);
        }
    }
}

这是我上面代码的输出:

This is my output for the code above

1 个答案:

答案 0 :(得分:1)

这不是一个Sierpinski三角形,几乎就像一个。您正在绘制单个小三角形(作为副作用,它在这些三角形之间有间隙 - &gt; "...*** ***..."

想象你如何创建这样一个三角形的最好方法是抓住一支铅笔和一张纸(有创建三角形的优化版本,但机械方法有利于开始):

  1. 选择深度(例如:3)
  2. 画一个三角形(最好是等边的,但任何可以做的)
  3. (如果深度 = 0则从此处返回,否则继续)
  4. 减少深度
  5. 将所有面积减半并标记这些点(用于视觉辅助)
  6. 连接这些点,这样您就会看到4个相等的小三角形
  7. 选择较小的三角形#1
  8. 致电第3行。
  9. 选择较小的三角形#2
  10. 致电第3行。
  11. 选择较小的三角形#3
  12. 致电第3行。
  13. 选择较小的三角形#4
  14. 致电第3行。
  15. 在此过程的某个地方,您需要管理从正整数开始的depth的状态。你必须在递归调用之间减少它并检查它是否为0,当你达到0时,你必须返回。它可以是一个全局变量(更容易理解但很难看),或者它可以是绘图函数的参数(很好)。

    这个“选择较小的三角形#x和呼叫线路3”。是自递归调用。 选择三角形只是计算较大三角形中较小三角形的正确坐标。

    如果深度大于1,则递归性质开始。代码将检查深度(如果达到0则返回),细分原始三角形,在第一个较小的三角形上调用自身,有效地处理这个较小的三角形,就像它是最初的大型(函数本身没有“更大”和“更小”的概念)。