有没有很酷的方法来定义/使用惰性评估序列计算PI?

时间:2014-06-28 09:19:46

标签: javascript node.js functional-programming lazy-evaluation

我在javascript上使用lazy.js.

我想知道是否有一种很酷的方法来定义(不是实际计算)由懒惰评估赋予的PI。

我知道懒惰评估是按需调用的,但是如何在惰性评估代码中定义PI?

例如,我们可以在lazy.js中定义自然数无限序列:

var _ = Lazy; 
var natural = function(n)
{
  return n;
};

var _natural = _.generate(natural);

当然,由于它是按需拨打的,你只能获得一部分自然数字,如

var n100 = _natural.take(100).toArray();

任何定义PI的方式都像自然数?

谢谢!

1 个答案:

答案 0 :(得分:1)

通过展开无穷无尽的连续逼近,有一种很酷的方法可以懒惰地计算pi。这些是所谓的无限制的龙头"算法(无限制,因为他们利用懒惰来产生无限的更好答案流)。

Jeremy Gibbon's paper,其中给出了一个(故意模糊的)示例:

pi = g(1,0,1,1,3,3) where
 g(q,r,t,k,n,l) =
  if 4*q+r-t<n*t
  then n : g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
  else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)