我想在SML中使用big int。请让我知道方向。
我可以做正常的斐波那契。但是我必须仅使用int而不是intinf打印fibo(100)。
fun fibo 0 = 0
| fibo n =
if n <= 2
then 1
else fibo (n-1) + fibo(n-2)
答案 0 :(得分:1)
- 我必须打印
fibo(100)
- 仅使用 int ,而非 IntInf.int 。
醇>
要解决其中的每一项,
只是打印(而不是存储)fibo(100)
并不一定涉及为大数字找到一个好的表示,所以我会将这个目标改为&#34;我必须找到一种代表大的方法数字,所以我可以添加它们并显示它们。&#34;
但是,正如John指出的那样,在计算fibo(100)
时,溢出 int 值并不是唯一的问题。试试fibo(40)
左右的幼稚实施。它不会溢出,但在我的计算机上至少需要几秒钟。现在尝试fibo(41)
,fibo(42)
等,并见证指数增长。您的算法不仅需要大整数的表示,还需要使用子指数资源。
E.g。通过使函数tail-recursive:
fun fib n =
let fun fib_ a b 0 = a (* or b *)
| fib_ a b i = fib_ b (a+b) (i-1)
in fib_ (Int.toLarge 0) (Int.toLarge 1) n end
您实际上只是在询问如何使用 int 来表示大于 int 的数字,这在逻辑上是不可能的。但也许你的意思是通过发明一个在系列中使用多个 int 的表示法。&#34;这正是 IntInf.int 所做的。请参阅示例How to use IntInf or LargeInt in SML?。
大整数的天真存在可以保留 int 的列表,成对添加它们并在触发handle Overflow
时继续。或者只是数字字符串!但这听起来更像是一种心理锻炼而非有用的东西。