2015-10-15 121 views
2

我不知道我怎么会在C.你将如何产生Sierpinski三角形的C(递归)

递归产生一定深度的Sierpinski三角形我写了这个功能来生成高度h形成一个三角形*的顶点坐标(x,y)*。

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]=' '; 
     } 
    } 



} 

使用此代码我可以生成“手动”Sierpinski三角形。但我想递归地做,任何深度和高度(高度可以被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

递归意味着函数自己调用。所以,而不是主要三角函数的所有调用,为什么没有三角函数增加它的参数,然后...等待它...调用三角形()! – par

+0

事情是,我不知道如何找到每个三角形的顶点为任何给定的深度 –

+0

你应该说在你的问题。正如所写的那样,“请为我做我的功课。”立即想到的一个想法是为称为“深度”的三角函数添加额外的参数。首先调用三角形()(深度为0),并从三角形内部用'++ depth'作为'depth'参数递归调用它。每当“深度%h”为零时,您就知道您处于三角形的顶部。 – par

回答

1

这不是一个谢尔宾斯基三角形,只是看起来很像一个。你正在绘制单独的小三角形(作为它在三角形之间有间隙的副作用 - >"...*** ***..."

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

  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

某处在这个过程中你需要管理其开始于depth的状态一个正整数。你必须在递归调用之间减少它,并检查它是否为0,当你达到0时,你必须返回。它可以是一个全局变量(容易理解但很难看),或者它可以是绘图函数的参数(很好)。

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

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