级数法求圆周率
【题目】圆周率是个无量纲常数,十分重要。圆周率的求法多种多样。级数法最常见。有些公式看上去很简洁,可惜收敛很慢。如下即是:
limn→∞∑k=1n1k2=π26 \lim_{n \to \infty} \sum_{k=1}^n \frac {1}{k^2} = \frac {\pi^2}{6} n→∞limk=1∑nk21=6π2
试用此法累加10000项求圆周率。
这个问题对 haskell 而言有点作弊。haskell简直就是把公式重复写了一遍而已。
myPI :: Double
myPI = sqrt . (6*) . sum $ take 10000 b级数
where
b级数 = [ 1/x^2 | x<-[1..] ]
main :: IO ()
main = do
print myPI
print pi
haskell 支持无限列表,这很方便。 (6*)是偏函数,haskell 中天生支持函数的currying,这样可以很方便地对函数进行复合。
除了这个公式,还有个 pi = 4 * (1/1 - 1/3 + 1/5 - 1/7 …) 也很有名。这里也试验一下吧。同样糟糕的收敛速度。
myPI2 = (4*) . sum . (take 10000) $ b级数
where
b级数 = zipWith (\x y -> 1/x * y) [1,3..] (cycle [1,-1])
lambda函数,在haskell中十分常见。haskell 本身就是基于 lambda 演算的。如果临时要用一个函数,当然不用那么隆重地起个名字,直接匿名就可以了。更重要的是,lambda 函数可以像数据一样传递,可以嵌套,有极强的表达能力。