gpt4 book ai didi

recursion - 标准 ML 斐波那契溢出

转载 作者:行者123 更新时间:2023-12-05 00:17:35 26 4
gpt4 key购买 nike

我一直在忙于学习一些函数式编程,并决定选择 ML 作为我的工具。自从我开始学习 ML 才几天,可能总共花了大约 5-6 个小时来解决一些问题。无论如何,谈谈我的问题。

通常在学习一门语言时,我会通过一些项目 euler 问题来了解语法和操作。所以我一直在研究一个需要阶乘函数的问题。虽然我不断收到溢出错误,但通常为了用其他语言解决这个问题,我会添加一些内存或依靠标准库来避免它,但我对 ML 的缺乏经验使内存看起来很陌生。

我已经尝试过使用尾递归但没有骰子的类似方法:

fun fact_helper (0,r:int) = r
| fact_helper (n:int,r:int) = fact_helper (n-1,n*r);

fun factorial n:int = fact_helper(n, 1);

即使使用标准库:
foldl op * 1 (List.tabulate(100, fn x => x + 1))

会导致溢出。

我已经做了一些谷歌搜索,但 ML 似乎有非常稀疏的讨论或社区。所以我想我的问题是什么是一个例子,或者我应该如何以内存的方式编写我的阶乘函数,或者一般来说如何避免 ML 中的溢出。

最佳答案

问题是您的实现依赖于 Int.int数据类型,在 SML/NJ 上限制为 31 位(参见 Int.precision )。这意味着您可以计算的值有一个上限。如果你试图超过这个限制,你会得到一个 Overflow异常(exception):

- (Option.valOf Int.maxInt) + 1;

uncaught exception Overflow [overflow]
raised at: <file stdIn>

解决方法是使用 IntInf 结构,提供任意精度算术:
open IntInf;

fun fact_helper (0,r:int) = r
| fact_helper (n:int,r:int) = fact_helper (n-1,n*r);

fun factorial n:int = fact_helper(n, 1);

factorial 50;
(* 30414093201713378043612608166064768844377641568960512000000000000 *)

关于recursion - 标准 ML 斐波那契溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862483/

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