gpt4 book ai didi

f# - f# 中的 int 溢出

转载 作者:行者123 更新时间:2023-12-01 06:20:23 25 4
gpt4 key购买 nike

我正在做一些家庭作业,我们应该在 F# 中创建一个组合函数。我已经降低了阶乘函数,但是一旦我得到一个大数字来使用阶乘,它似乎就会溢出。 (比方说 20)我知道我可以使用 int64 或 float ,但这会改变代码中的所有输入。我应该使用什么数据类型?

let rec Fact (a:int)=
if (a = 0) then 1 else a*Fact(a-1);;

let combo (n:int) (k:int)=
if (n = 0) then 0 else (Fact n)/((Fact k)*(Fact (n-k)));;

现在在代码中,当我执行 combo 20 5;;它给了我 2147。这显然是错误的答案。我查看了阶乘函数,当我在其中输入 20 时,它给了我一个很大的负数。任何帮助将非常感激。提前致谢。

最佳答案

首先,如果你想避免意外,你可以打开Checked文件顶部的模块。这将重新定义数字运算符,以便它们执行溢出检查 - 你会得到一个异常而不是意外的数字:

open Microsoft.FSharp.Core.Operators.Checked

正如 Fyodor 在评论中指出的那样,您不能将 20 的阶乘放入 int 中你需要 int64 .但是,您的 combo然后函数执行除法,结果为 combo 20 5足够小以放入 int .

一种选择是更改 Fact使用 int64 , 但保留 combo作为一个接受并返回整数的函数——你需要将它们转换为 int64打电话前 Fact然后回到int执行除法后:

let rec Fact (a:int64) =
if (a = 0L) then 1L else a * Fact(a-1L)

let combo (n:int) (k:int) =
if (n = 0) then 0 else int (Fact (int64 n) / (Fact (int64 k) * Fact (int64 (n-k))))

现在您可以调用combo 20 5你会得到15504作为结果。

编辑:正如@pswg 在另一个答案中指出的那样,int64也很有限,所以你需要 BigInteger对于更大的阶乘。但是,同样的方法应该适用于 BigInteger。 .您可以保留 combo作为返回 int 的函数运行通过从 BigInteger 转换回来至 int .

关于f# - f# 中的 int 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41684233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com