2013-11-25 97 views
1

我只是在尋找維基百科頁面,我發現這個Sierpinski triangle程序打印謝爾賓斯基三角形

我想創建由java這個三角形,cscala

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

如何創建此謝爾賓斯基三角形

只是給我想法來解決這個問題?

+5

您已標記5種語言。您想使用哪種語言解決方案? –

+0

我只是尋找'邏輯'來解決這個三角形。您可以使用任何語言提供 –

+1

邏輯是使用遞歸。每個三角形可以分成四個小三角形。讓中間的一個空白,並在其他三個上遞歸地調用自己。在某個任意點停止遞歸併使用你的例程繪製正常的三角形。 – john

回答

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

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

有多種方式在涉及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*