1

我正在尝试编写一个使用此函数的 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))),等等}

根据我的理解,列表的第 n 个条目F(x,y)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 很陌生,所以我一直在试图弄清楚为什么这不起作用以及如何使它真正起作用。有什么帮助吗?

4

1 回答 1

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 套装;)

于 2012-10-01T22:01:42.913 回答