標準の言語MLでxを17の累乗に換算する単純な手続きを記述しようとしています。私は "手助けの手続き"でそれをするはずです:SMLオーバーフロー:累乗手続き
fun help (y:int) = y * y * y * y;
fun power17 (x:int) = help (help (help (help (x)))) * x;
これはオーバーフローを引き起こします。誰かがそれがなぜそうするのか教えてもらえますか?
標準の言語MLでxを17の累乗に換算する単純な手続きを記述しようとしています。私は "手助けの手続き"でそれをするはずです:SMLオーバーフロー:累乗手続き
fun help (y:int) = y * y * y * y;
fun power17 (x:int) = help (help (help (help (x)))) * x;
これはオーバーフローを引き起こします。誰かがそれがなぜそうするのか教えてもらえますか?
整数オーバーフローが発生しています。コードを機能させるには、を使用する必要があります。
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;
あなたの関数は、それを評価する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)