F# 数学序列中的其他元素

F# 数学序列中的其他元素,f#,functional-programming,sequence,F#,Functional Programming,Sequence,假设我有以下等式。我的目标是创建一个序列,该序列返回该序列的下一个元素。这是我的解决方案,它是有效的: let rec factorial(n:float) = match n with |0.0 -> 1.0 |n -> n * factorial(n-1.0) let seq1 = Seq.initInfinite( fun i -> factorial(float(i)) / sqrt(float(i)+1.0) )) 现在,类似地,我想创建一

假设我有以下等式。我的目标是创建一个序列,该序列返回该序列的下一个元素。这是我的解决方案,它是有效的:

let rec factorial(n:float) =
    match n with
    |0.0 -> 1.0
    |n -> n * factorial(n-1.0)

let seq1 = Seq.initInfinite( fun i -> factorial(float(i)) / sqrt(float(i)+1.0) ))
现在,类似地,我想创建一个序列,它根据方程返回元素:

我有一些代码,但它是错误的,所以如何使它工作

let seq2(x:float) = Seq.initInfinite(fun a -> let i = float(a)                                      
                                              (1.0/factorial(0.0)) + System.Math.Pow(x,i)/factorial(i) )
你能跳过等式的(1.0/阶乘(0.0))部分吗(或者我误解了这个问题)

编辑:即

let seq2(x:float) = 
  Seq.initInfinite(fun a -> 
    let i = float(a) in 
      System.Math.Pow(x,i)/factorial(i))
编辑:要截断序列,可以使用“take”,要求和,可以使用“sum”。如

let seq2sum nbelems = 
    seq2 >> Seq.take nbelems >> Seq.sum

然后得到
seq2sum 12 3.0
约等于20:-)

函数式语言的好处在于,您可以使解决方案尽可能接近原始定义的表达式

对于大多数函数,可以避免显式类型声明:

let rec factorial = function
| 0 -> 1
| n -> n * (factorial (n-1))


let e x n = 
    seq { 0 .. n } 
    |> Seq.map(fun i -> x ** (float i) / float (factorial i))
    |> Seq.sum
在无穷级数中,求和前必须先取前n个条目,因为无穷级数永远无法完成计算:

let e' x n = 
    Seq.initInfinite(fun i -> x ** (float i) / float (factorial i))
    |> Seq.take n
    |> Seq.sum

e 1.0 10 //2.718281801
e' 1.0 10 //2.718281801

哈哈,我没有检查
(x^0)/0!=1 / 0!更早。现在可以了。顺便问一下,如何得到序列的
x
元素的和?