-2

好的,所以我试图根据您提供给函数的泰勒展开式中的项数来近似 pi。但是我得到了很多错误,最后一个是无法推断实例:

这是我的代码:

pie :: Rational -> Rational
pie n = 4.0 * (pie_h n 1.0)

pie_h :: Rational -> Rational
pie_h x y = if(x==0) then 0.0 
             else if ((y mod 2.0)/=0) then (1.0/y)+ pie_h (x-1.0) (y+2.0)
             else (-1.0/y)+(pie_h (x-1.0) (y+2.0))
4

2 回答 2

1

类型签名错误。您说这pie_h是一个接受单个参数 aRational并返回 aRational的函数,但随后将其定义为接受两个参数x和的函数y

pie_h :: Rational -> Rational -> Rational
pie_h x y = ...

您还可以通过模式匹配稍微简化这一点,并分解出唯一变化的东西,即第一项的符号。

pie_h 0 _ = 0.0
pie_h x y = (if even y then -1 else 1) / y + pie_h (x - 1.0) (y + 2.0)
于 2016-03-26T20:31:21.317 回答
1

如果您使用 pi 的莱布尼茨公式,它不会在 n 上收敛任何实际值。

无论效率如何,您都可以以更直接的方式实现它

定义一个反函数(\x->1/x)和交替求和函数 (x1-x2+x3...)

例如,

import Ratio

invert :: Integer -> Rational
invert x = 1%x

altsum :: (Num a) => [a] -> a
altsum [] = 0
altsum (x:xs) = x - altsum xs

现在,将两者与奇数系列结合起来

fromRational $ (*) 4 $ altsum $ take 100 $ map invert [1,3..]

3.131592903558553

您可以将您的 approx_pi 函数定义为

approx_pi n = (fromRational . (*) 4 . altsum . take n . map invert) [1,3..]     
于 2016-03-26T21:55:22.077 回答