haskell 基础题解(28)

本文探讨了使用级数法计算圆周率π的两种经典方法,并通过Haskell语言实现,展示了无限列表和函数式编程的魅力。介绍了级数收敛特性及Haskell在数学计算上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

级数法求圆周率

【题目】圆周率是个无量纲常数,十分重要。圆周率的求法多种多样。级数法最常见。有些公式看上去很简洁,可惜收敛很慢。如下即是:
lim⁡n→∞∑k=1n1k2=π26 \lim_{n \to \infty} \sum_{k=1}^n \frac {1}{k^2} = \frac {\pi^2}{6} nlimk=1nk21=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 函数可以像数据一样传递,可以嵌套,有极强的表达能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值