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 番目のエントリは、それ自体で n 回構成され、次に適用される関数F(x,y)です。E(x,y)(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のは正しいことです。引数が 2 つの関数があり、引数の 1 つを固定して反復したいとします。固定引数が先の方が使いやすいので in で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)

マンデルブロー集合の制作を楽しんでください ;)

于 2012-10-01T22:01:42.913 に答える