我正在尝试在J中生成Sierpinski三角形(混沌游戏版本)。给定3个顶点生成它的一般迭代算法是:
point = (0, 0)
loop:
v = randomly pick one of the 3 vertices
point = (point + v) / 2
draw point
我正在尝试用J创建惯用版。到目前为止,这就是我所拥有的:
load 'plot'
numpoints =: 200000
verticesx =: 0 0.5 1
verticesy =: 0 , (2 o. 0.5) , 0
rolls =: ?. numpoints$3
pointsx =: -:@+ /\. rolls { verticesx
pointsy =: -:@+ /\. rolls { verticesy
'point' plot pointsx ; pointsy
这样可行,但我不确定我是否理解-:@+ /\.
发生了什么。我认为这只是因为数学怪癖而起作用。我试图制作一个二元average
函数,它可以像+
+/ \ i. 10
中avg
一样在点列表中作为累积运行,但我无法得到类似的函数那工作。我该怎么做?
要清楚,我正在尝试创建一个我可以这样使用的二进制函数avg /\ randompoints
:
avg =: -:@+
出于某种原因, avg
无效。所以我认为我遇到的问题是正确定义具有适当可变参数的{{1}}函数。
答案 0 :(得分:1)
为了尽可能接近算法,我可能会做这样的事情:
v =: 3 2$ 0 0 0.5, (2 o. 0.5), 1 0
ps =: 1 2 $ (?3) { v
next =: 4 :'y,((?x){v) -:@+ ({: y)'
ps =: (3&next)^:20000 ps
'point' plot ({.;{:) |: ps
但你的版本很多效率更高。