我只是看维基百科页面,我发现了这个Sierpinski triangle
我希望按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")
}
}
打印此
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三角形?
请给我解决这个问题的想法?
答案 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*