数学序列的进一步要素

时间:2017-02-10 19:44:14

标签: f# functional-programming sequence

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

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) ))

现在,类似地,我想根据等式创建返回元素的序列: e do x

我有一些代码,但这是错误的,如何让它工作?

let seq2(x:float) = Seq.initInfinite(fun a -> let i = float(a)                                      
                                              (1.0/factorial(0.0)) + System.Math.Pow(x,i)/factorial(i) )

2 个答案:

答案 0 :(得分:3)

你不能跳过等式(1.0 /阶乘(0.0))部分(或者我误解了这个问题)。

编辑:即

let seq2(x:float) = 
  Seq.initInfinite(fun a -> 
    let i = float(a) in 
      System.Math.Pow(x,i)/factorial(i))

编辑:截断您可以使用的seq'采取'总之,你可以使用' sum'。如在

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

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

答案 1 :(得分:3)

功能语言的优点在于,您可以使解决方案尽可能接近原始定义的表达。

您可以避免大多数函数的显式类型声明:

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