F#在计算无穷系列和时获取堆栈溢出

F# Get stack overflow while counting infinite sum of series

我做了一个无限计数的程序sum of series 但得到一个错误:堆栈溢出。请帮忙

let sum_series (max : float) =
    let rec f (a:float, x : float) = 
        match x with
            | 0. -> a
            | x -> f ((1. / (x * x) + a), x - 1.)
    f (0., max)
 
[<EntryPoint>]
let main args =
    let (b, max) = System.Double.TryParse(args.[0])
    printfn "%A" (sum_series max)
    0

如果您使用非整数的 max 值调用函数,代码将进入无限循环。问题是你在每一步中都从 max 中减去 1.0,但最后你只检查它是否等于 0.0。如果您从 0.1 开始,您的下一个值将是 -0.9, -1.9, -2.9

您是否只想检查 x 小于 0.0 的情况?您可以将 match 更改为普通的 if(这样更简单)并使用:

let sum_series (max : float) =
  let rec f (a:float, x : float) = 
      if x < 0. then a
      else f ((1. / (x * x) + a), x - 1.)
  f (0., max)