2017-10-12 9 views
0

標準の言語MLでxを17の累乗に換算する単純な手続きを記述しようとしています。私は "手助けの手続き"でそれをするはずです:SMLオーバーフロー:累乗手続き

fun help (y:int) = y * y * y * y; 

fun power17 (x:int) = help (help (help (help (x)))) * x; 

これはオーバーフローを引き起こします。誰かがそれがなぜそうするのか教えてもらえますか?

答えて

1

整数オーバーフローが発生しています。コードを機能させるには、を使用する必要があります。

fun help (y: LargeInt.int) = y * y * y * y; 

    fun power17 (x: int) = 
    let 
     val x' = Int.toLarge x 
    in 
     help (help (help (help (x')))) * x' 
    end; 

もう一つは、そのコードではなく、それはx ** 257をやっている、x ** 17を計算されていません。

あなたは二回しか helpを呼び出す必要があります

fun power17 (x:int) = (help (help x)) * x; 
0

あなたの関数は、それを評価する17の電力を計算しません:

power17 2 ~> help (help (help (help x))) * 2 
      ~> help (help (help (2 * 2 * 2 * 2))) * 2 (* that's 2^5 *) 
      ~> help (help (help (8))) * 2 
      ~> help (help (8 * 8 * 8 * 8)) * 2  (* that's 2^13 *) 
      ~> help (help (4096)) * 2 
      ~> help (4096 * 4096 * 4096 * 4096) * 2 (* that's 2^49 *) 
      ~> raise Overflow (* most SML compilers have 32-bit ints *) 

はおそらく、あなたが書くためのもの:

fun power17 x = help x * help x * help x * help x * x 

それは再帰の理想的なケースのように聞こえますが、

fun power (x, 0) = 1 
    | power (x, n) = x * power (x, n-1) 

fun power17 x = power (x, 17)