SML Fibonacci数量很大。使用int数据类型

时间:2016-06-01 08:32:48

标签: sml

我想在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)

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我必须打印fibo(100)
  2.   
  3. 仅使用 int ,而非 IntInf.int
  4.   

要解决其中的每一项,

  1. 只是打印(而不是存储)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
    
  2. 您实际上只是在询问如何使用 int 来表示大于 int 的数字,这在逻辑上是不可能的。但也许你的意思是通过发明一个在系列中使用多个 int 的表示法。&#34;这正是 IntInf.int 所做的。请参阅示例How to use IntInf or LargeInt in SML?

    大整数的天真存在可以保留 int 的列表,成对添加它们并在触发handle Overflow时继续。或者只是数字字符串!但这听起来更像是一种心理锻炼而非有用的东西。