【问题标题】:F# function return valueF#函数返回值
【发布时间】:2016-11-07 06:14:12
【问题描述】:

我是 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 时。答案是好的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。谁能解释发生了什么?

【问题讨论】:

  • int 返回值是否溢出?它适用于其他输入吗?
  • @Lee 是的,你完全正确,谢谢。我对理解函数范式感到非常困惑,所以我没有看到那个明显的原因。

标签: .net f# functional-programming


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-10-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多