2017-10-12 8 views
0

J'essaie d'écrire une procédure simple qui calcule x à la puissance de 17 dans le langage Standard ML. Je suis censé le faire avec une "procédure d'aide":Débordement dans SML: procédure d'exponentiation

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

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

Cela provoque un débordement. Quelqu'un peut-il me dire pourquoi il le fait?

Répondre

1

Vous obtenez un débordement d'entier. Si vous voulez que votre code fonctionne, vous devez utiliser .

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; 

Une chose, que le code ne calcule pas x ** 17, au lieu qu'il fait x ** 257.

Vous ne devez appeler help deux fois:

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

Votre fonction ne calcule pas la puissance de 17. Évaluer il:

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 *) 

Peut-être que vous vouliez écrire:

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

Cela ressemble à un cas idéal pour la récursivité, cependant:

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

fun power17 x = power (x, 17)