.net F函数返回值

.net F函数返回值,.net,f#,functional-programming,.net,F#,Functional Programming,我是F新手,当我尝试实现函数rpt时,我发现了一些问题 let rec rpt f n x = if n=0 then x else f ( rpt f (n-1) x ) 当我把这个函数称为rpt fun x->x*x 4 2时。答案是ok val it:int=65536,但当我将rpt更改为2时: let rec rpt f n x = if n=0 then 2*x else f ( rpt f (n-1) x ) 函数

我是F新手,当我尝试实现函数rpt时,我发现了一些问题

let rec rpt f n x =
    if n=0 then x
    else 
       f ( rpt f (n-1) x )
当我把这个函数称为rpt fun x->x*x 4 2时。答案是ok val it:int=65536,但当我将rpt更改为2时:

let rec rpt f n x =
    if n=0 then 2*x
    else 
       f ( rpt f (n-1) x )

函数只返回零:val it:int=0。有人能解释一下发生了什么吗?

重复四次平方函数得到的总幂为2^4=16,这与您的第一个答案完全一致-65536=2^16。但是如果你在开始的时候加上一个额外的二次幂,你会得到16*2=32的总幂,这恰好是int类型的大小,所以它完全溢出,并且为零

您可以通过将int替换为int64来验证这一点:


int返回值是否溢出?它对其他输入有用吗?@Lee是的,你完全正确,谢谢。我对理解功能范式感到困惑,所以我没有看到明显的原因。
let rec rpt f n x =
    if n=0 then 2L*x
    else 
       f ( rpt f (n-1) x )

> rpt (fun x -> x*x) 4 2L;;
val it : int64 = 4294967296L

> pown 2L 32;;
val it : int64 = 4294967296L