Java 打印Sierpinski三角形的程序

Java 打印Sierpinski三角形的程序,java,c,algorithm,scala,logic,Java,C,Algorithm,Scala,Logic,我只是在看维基百科的网页,我发现了这个 我想通过java,c,scala等创建这个三角形 1 111 11111

我只是在看维基百科的网页,我发现了这个

我想通过
java
c
scala
等创建这个三角形

                               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")
    }
  }
这是:

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");
    }
  } 
def三角形={

对于(i我已经用JavaScript编写了Sierpinski triangle程序。此JavaScript代码在Chrome中运行

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

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();
    }
}

减少了计算时间

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

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

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();
    }
}

减少了计算时间

我不知道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

我不知道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

有多种方法可以做到这一点,方法是以一种巧妙的方式构造索引,如预期的那样,在某个地方使用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*

有多种方法可以做到这一点,方法是以一种巧妙的方式构造索引,如预期的那样,在某个地方使用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*

你已经标记了5种语言。你想要哪种语言的解决方案?我只是在寻找
logic
来解决这个三角形。你可以用任何语言提供逻辑,使用递归。每个三角形可以分成四个较小的三角形。中间的一个空白,其余三个递归调用。在任意点不要停止递归,使用你的例程来绘制法线三角形。@RahulKulhari:你使用的工具确实倾向于“着色”你用来解决这个问题的方法。例如,Java是一种只面向对象的语言,C不是面向对象的。在Scheme/lisp中解决这个问题将是一项全功能的工作,JavaScript也是如此,而使用Perl将产生代码高尔夫风格的答案……你已经标记了5种语言。你想要哪种语言的解决方案?我只是在寻找
逻辑
来解决这个三角形。你可以用任何语言提供这个逻辑是使用递归。每个三角形可以分成四个较小的三角形。中间一个空白,然后递归调用其他三个三角形。在任意点停止递归,用你的例程来绘制法线三角形。@RahulKulhari:你使用的工具一定要对你用来解决这个问题的方法进行“着色”。例如,Java是一种只面向对象的语言,C绝不是面向对象的。在Scheme/lisp中解决这个问题将是一项全功能的工作,JavaScript也是如此,而使用Perl将产生代码高尔夫风格的答案。。。