F#计算堆栈的无限总和时获取堆栈溢出

问题描述

我制作了一个程序来计算无穷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值调用函数,则代码将陷入无限循环。问题是您在每一步中都从1.0中减去max,但是最后只检查它是否等于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)