在haskell折叠的拼图功能?

时间:2014-11-17 08:04:44

标签: haskell

我很难弄清楚这个功能是如何工作的,我需要专家的解释。感谢任何帮助!

puzzle n x = scanr (\y acc -> (acc + y/acc)/2) 1 (replicate n x)

我尝试过运行这些:

--puzzle 10 2

--puzzle 10 5

--puzzle 10 36

它分别给出了这个输出:

[1.414213562373095,1.414213562373095,1.414213562373095,1.414213562373095,1.414213562373095,1.414213562373095,1.4142135623746899,1.4142156862745097,1.4166666666666665,1.5,1.0]

[2.23606797749979,2.23606797749979,2.23606797749979,2.23606797749979,2.23606797749979,2.236067977499978,2.2360688956433634,2.238095238095238,2.3333333333333335,3.0,1.0]

[6.0,6.0,6.0,6.0,6.000000005333189,6.0002529841194185,6.055351744849479,6.872226737643129,10.222972972972974,18.5,1.0]

2 个答案:

答案 0 :(得分:2)

此函数使用牛顿公式计算平方根,并将所有迭代结果存储在列表中。

Here是维基上的牛顿方法。

存储过程基于scanr函数的定义:

  

scanr与foldr类似,但返回一个列表   来自右侧的连续减少值

答案 1 :(得分:1)

它列出了n x-es,如[x,x,x,x,x,..](n次)

然后它的作用是:

x1 = ( 1 +  x/1)/2
x2 = (x1 + x/x1)/2
x3 = (x2 + x/x2)/2
x4 = (x3 + x/x3)/2

,结果为[xn,x(n-1),...,x2,x1]