如何编写像这样的泰勒级数递归数据:
fib = 0 : scanl (+) 1 fib
例如,我想要promt这样的东西:
fac n = product[1..n]
sin' x = x : x^3/fac(3) : x^5/fac(5) : ...
sum $ take 10 (sin' (pi/6))
获得正弦泰勒系列的10个第一要素的总和。
答案 0 :(得分:8)
这不是泰勒系列的罪恶!但这是一个线索...
products = scanl (*) 1 [1..]
powers x = map (x^) [0..]
exp' x = zipWith (/) (powers x) products
*Main> sum (take 10 (exp' 1))
2.7182815255731922
答案 1 :(得分:3)
一种常见的方法是使用一个列表来表示幂级数的系数,并编写另一个函数来评估特定值的幂级数。
例如,幂列表1 /(1-x)^ 2 = 1 + 2x + 3x ^ 2 + ...将由列表[1,2,3,...]
表示。
为了评估它,我们需要一个函数:
eval :: [Float] -> Float -> Float
基本案例很简单:
eval [] x = 0
归纳案例可以递归定义:
eval (a:as) x = a + x*... -- left as an exercise
当然,这个eval
不会在无限列表中终止,所以你必须确保只给它有限的列表:
sin' = [ 1, 0, - 1 / fac 3, 0, 1 / fac 5, 0, ... ]
eval (take 10 sin') (pi/6)
现在你只需要生成sin'
的系数。请注意,在这种情况下,10
指的是您想要求和的最高幂x
,而不是总和中非零项的数量。