打印Sierpinski三角形的程序

时间:2013-11-25 07:33:42

标签: java c algorithm scala logic

我只是看维基百科页面,我发现了这个Sierpinski triangle

我希望按javacscala等创建此三角形。

                               1                               
                              111                              
                             11111                             
                            1111111                            
                           111111111                           
                          11111111111                          
                         1111111111111                         
                        111111111111111                        
                       1               1                       
                      111             111                      
                     11111           11111                     
                    1111111         1111111                    
                   111111111       111111111                   
                  11111111111     11111111111                  
                 1111111111111   1111111111111                 
                111111111111111 111111111111111                
               1                               1               
              111                             111              
             11111                           11111             
            1111111                         1111111            
           111111111                       111111111           
          11111111111                     11111111111          
         1111111111111                   1111111111111         
        111111111111111                 111111111111111        
       1               1               1               1       
      111             111             111             111      
     11111           11111           11111           11111     
    1111111         1111111         1111111         1111111    
   111111111       111111111       111111111       111111111   
  11111111111     11111111111     11111111111     11111111111  
 1111111111111   1111111111111   1111111111111   1111111111111 
111111111111111 111111111111111 111111111111111 111111111111111

我只是创建一个简单的程序,就像我在c中创建简单模式一样,我在scala

中写了这个
def ft(n: Int) = {
    for (i <- 1 to n) {
      for (j <- n to i by -1) {
        print(" ")
      }
      for (k <- 1 to 2 * i - 1) {
        print("1")

      }
      print("\n")
    }
  }

打印此

           1
          111
         11111
        1111111
       111111111

和此:

def triangle = {
    for (i <- 1 to 5) {
      for (j <- 1 to 5) {
        if (j <= i)
          print("1")
        else
          print(" ")
      }
      for (j <- 5 to 1 by -1) {
        if (j <= i)
          print("1");
        else
          print(" ");
      }
      print("\n");
    }
  } 

如何创建 Sierpinski三角形

请给我解决这个问题的想法?

3 个答案:

答案 0 :(得分:2)

我不知道Scala或Java,但似乎这种语言并不重要。这是PostScript的解决方案:

%PS-Adobe 3.0

/Sierp {    % x1 y1 x2 y1 x3 y3 depth
    13 dict begin
        /D exch def
        /Y3 exch def
        /X3 exch def
        /Y2 exch def
        /X2 exch def
        /Y1 exch def
        /X1 exch def

        D 0 le {
            newpath
            X1 Y1 moveto
            X2 Y2 lineto
            X3 Y3 lineto
            fill
        } {
            /X12 X1 X2 add 0.5 mul def
            /Y12 Y1 Y2 add 0.5 mul def
            /X23 X2 X3 add 0.5 mul def
            /Y23 Y2 Y3 add 0.5 mul def
            /X31 X3 X1 add 0.5 mul def
            /Y31 Y3 Y1 add 0.5 mul def

            X1 Y1 X12 Y12 X31 Y31 D 1 sub Sierp
            X12 Y12 X2 Y2 X23 Y23 D 1 sub Sierp
            X31 Y31 X23 Y23 X3 Y3 D 1 sub Sierp
        } ifelse

    end
} bind def

/Sierpinski {   % xc yc radius depth
    4 dict begin
        /D exch def
        /R exch def
        /Y exch def
        /X exch def

        X
        Y R add
        X 0.8333 R mul add
        Y -0.5 R mul add
        X -0.8333 R mul add
        Y -0.5 R mul add
        D
        Sierp
    end
} bind def

300 400 250 6 Sierpinski
showpage

答案 1 :(得分:1)

我用JavaScript编写了Sierpinski三角形程序。此JavaScript代码在Chrome中运行。

Sierpinski triangle。要查看代码,请在右上角单击“在JsFiddle中编辑”链接。这里的想法是生成数据,然后为每个数字绘制圆圈。

function Triangle() {}

Triangle.prototype.height = function () {
    return this.data.length;
}

Triangle.prototype.scale = function scale(ctx, height) {
    ballsfits = this.canvas.width / 2;
    ballsgot = height;
    var scale = ballsfits / ballsgot;
    ctx.scale(scale, scale);
    return scale;
}

Triangle.prototype.init = function () {
    this.canvas = gCanvas();
    var ctx = this.canvas.getContext("2d");
    this.canvas.width = this.canvas.width; //clear
    ctx.strokeStyle = "#000";
    return ctx;
}

Triangle.prototype.generate = function (height) {
    //init
    this.data = new Array();
    this.data.push([1]);
    this.data.push(new Array(1, 1));

    for (var i = 2; i < height; i++) {
        var cRow = [1];
        // add each two members of preceeding row
        for (var j = 0; j < this.data[i - 1].length - 1; j++)
        cRow.push((this.data[i - 1][j] + this.data[i - 1][j + 1]) % 2);
        cRow.push(1);
        this.data.push(cRow);
    }
}

Triangle.prototype.draw = function () {
    var h = this.height();
    var ctx = this.init();
    var scale = this.scale(ctx, h);
    for (var y = 0; y < h; y++)
    for (var x = 0; x < this.data[y].length; x++)
    if (0 != this.data[y][x]) {
        ctx.beginPath();
        ctx.arc(h - this.data[y].length + x * 2 + 1, y * 2 + 1, 1, 0, Math.PI * 2);
        ctx.fill();
    }
}

代码不使用大数字。唯一需要的信息是该数字是否可被2整除。所以0,1使用:

(this.data[i - 1][j] + this.data[i - 1][j + 1]) % 2

减少了计算时间

答案 2 :(得分:1)

有多种方法可以通过以一种巧妙的方式构建索引来实现这一点,其中包含2的幂,如同预期的那样,但是python一直都是最干净的表示,尽管有点落后

def sierpinski(n):    
  d = ["*"]    
  for i in xrange(n):        
    sp = " " * (2 ** i)        
    d = [sp+x+sp for x in d] + [x+" "+x for x in d]    
return d 

print "\n".join(sierpinski(4))

诀窍是要意识到它不是打印构成三角形的*,而是所有空格,在代码中将“”更改为“c”,您将看到以下内容。想法是从一个基本模式开始并继续追加它的头部和尾部,所以你从2个元素开始,然后是4个,然后是8个,最后是16个。由于python打印带有换行符分隔符的列表,你自然会得到你正在寻找的模式。

sp is c
['c*c', '*c*']


sp is cc
['ccc*ccc', 'cc*c*cc', 'c*ccc*c', '*c*c*c*']


sp is cccc
['ccccccc*ccccccc', 'cccccc*c*cccccc', 'ccccc*ccc*ccccc', 'cccc*c*c*c*cccc', 'ccc*ccccccc*ccc', 'cc*c*ccccc*c*cc', 'c*ccc*ccc*ccc*c', '*c*c*c*c*c*c*c*']


sp is cccccccc
['ccccccccccccccc*ccccccccccccccc', 'cccccccccccccc*c*cccccccccccccc', 'ccccccccccccc*ccc*ccccccccccccc', 'cccccccccccc*c*c*c*cccccccccccc', 'ccccccccccc*ccccccc*ccccccccccc', 'cccccccccc*c*ccccc*c*cccccccccc', 'ccccccccc*ccc*ccc*ccc*ccccccccc', 'cccccccc*c*c*c*c*c*c*c*cccccccc', 'ccccccc*ccccccccccccccc*ccccccc', 'cccccc*c*ccccccccccccc*c*cccccc', 'ccccc*ccc*ccccccccccc*ccc*ccccc', 'cccc*c*c*c*ccccccccc*c*c*c*cccc', 'ccc*ccccccc*ccccccc*ccccccc*ccc', 'cc*c*ccccc*c*ccccc*c*ccccc*c*cc', 'c*ccc*ccc*ccc*ccc*ccc*ccc*ccc*c', '*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*']


ccccccccccccccc*ccccccccccccccc
cccccccccccccc*c*cccccccccccccc
ccccccccccccc*ccc*ccccccccccccc
cccccccccccc*c*c*c*cccccccccccc
ccccccccccc*ccccccc*ccccccccccc
cccccccccc*c*ccccc*c*cccccccccc
ccccccccc*ccc*ccc*ccc*ccccccccc
cccccccc*c*c*c*c*c*c*c*cccccccc
ccccccc*ccccccccccccccc*ccccccc
cccccc*c*ccccccccccccc*c*cccccc
ccccc*ccc*ccccccccccc*ccc*ccccc
cccc*c*c*c*ccccccccc*c*c*c*cccc
ccc*ccccccc*ccccccc*ccccccc*ccc
cc*c*ccccc*c*ccccc*c*ccccc*c*cc
c*ccc*ccc*ccc*ccc*ccc*ccc*ccc*c
*c*c*c*c*c*c*c*c*c*c*c*c*c*c*c*