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将产生代码高尔夫风格的答案。。。