首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标准ML fibonacci溢出

标准ML fibonacci溢出
EN

Stack Overflow用户
提问于 2016-10-04 22:05:23
回答 1查看 706关注 0票数 5

我一直在学习一些函数式编程,并决定选择ML作为我的工具。我刚学到ML,大概花了5-6个小时来解决一些问题。不管怎样,关于我的问题。

通常,在学习一种语言时,我会通过几个euler项目来了解语法和操作。所以我一直在研究一个需要阶乘函数的问题。虽然我一直有一个溢出错误,通常为了用其他语言解决这个问题,我会添加一些回忆录或者依赖标准库来避免它,但是我在ML方面的经验让回忆录看起来很陌生。

我尝试过这样的方法,使用尾递归,但没有骰子:

代码语言:javascript
复制
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);

即使使用标准的lib:

代码语言:javascript
复制
foldl op * 1 (List.tabulate(100, fn x => x + 1))

会导致溢出。

我已经做了一些谷歌搜索,但ML似乎有非常少的讨论或社区。因此,我想我的问题是,什么是一个例子,或者我应该如何以回忆录的方式编写我的阶乘函数,或者一般情况下,如何避免ML中的溢出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 22:25:18

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

代码语言:javascript
复制
- (Option.valOf Int.maxInt) + 1;

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

解决方案是使用IntInf结构,它提供任意精度算法:

代码语言:javascript
复制
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 *)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39862483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档