我正在尝试编写一个使用此函数的Haskell函数:
E(x,y)(i,j)=((i * i) - (j * j)+ x,(2 * i * j)+ y)
点F(x,y)
的列表(x,y)
应该是无限的项目列表:
F(x,y)= {(0,0),F(x,y)(0,0),F(x,y)(F(x,y)(0,0)),F (x,y)(F(x,y)(F(x,y)(0,0)))等等}
根据我的理解,列表F(x,y)
的第n个条目是E(x,y)
函数,它自己组成n次,然后应用于(0,0)
这就是我到目前为止的想法:
entry :: (Int,Int) -> [(Int,Int)]
efunction (i,j)(x,y) = ((i*i) - (j*j) + x, (2*i*j) + y)
entry (x,y) = efunction(0,0)(x,y) where
efunction = (0,0) : iterate efunction(i,j)
此外,(x,y)=(0,0)
并保持不变。唯一变化的变量是(i,j)
。
示例输出
entry(1,1) =
0,0
1,1
1,3
-7,7
1,-97
我对Haskell很陌生,所以我一直试图解决为什么这不起作用以及如何让它真正起作用。有什么帮助吗?
答案 0 :(得分:7)
你的方式很好,使用iterate
是正确的。你有两个参数的函数,并希望用一个固定的参数迭代它。如果固定参数是第一个,那么在iterate
中使用会更方便,所以让我们定义
step (x,y) (i,j) = (i*i - j*j + x, 2*i*j + y)
然后通过迭代部分应用的函数step (x,y)
得到您想要的列表,其初始点为(0,0)
,
entry (x,y) = iterate (step (x,y)) (0,0)
如果使用entry
的参数而不是部分应用的step
来定义本地函数,则可能更容易理解,
entry (x,y) = iterate next (0,0)
where
next (u,v) = (u*u - v*v + x, 2*u*v + y)
制作你的Mandelbrot套装很有趣;)