F#计算无穷级数和时获得堆栈溢出

F#计算无穷级数和时获得堆栈溢出,f#,stack-overflow,F#,Stack Overflow,我做了一个数无穷的程序 但是得到一个错误:堆栈溢出。请帮忙 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 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
let sum_系列(最大:浮点)=
设rec f(a:float,x:float)=
将x与
| 0. -> A.
|x->f((1./(x*x)+a),x-1。)
f(0,最大值)
[]
让主参数=
let(b,max)=System.Double.TryParse(args.[0])
打印fn“%A”(最大和系列)
0

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

您是否只想检查
x
小于
0.0
时的情况?您可以将
匹配更改为普通的
(如果
(这会使操作更简单)并使用:

let sum_系列(最大:浮点)=
设rec f(a:float,x:float)=
如果x<0。然后
否则f((1./(x*x)+a),x-1。)
f(0,最大值)

是否所有输入都会溢出?你能给它一个溢出的输入,你认为不应该吗?而且,它看起来是设计用来处理整数值x的,因为你将x减1,当x为0时停止。如果是这样,您应该键入x作为int。如果不是,您应该更改停止条件