为什么这会导致溢出错误?(SML)
这段代码产生了一个溢出错误,我不能完全确定原因。这是在SML,我有点不熟悉的时刻,所以我不完全知道如何修复它为什么这会导致溢出错误?(SML),sml,smlnj,Sml,Smlnj,这段代码产生了一个溢出错误,我不能完全确定原因。这是在SML,我有点不熟悉的时刻,所以我不完全知道如何修复它 fun detPrime(num:int, divn:int) = if divn = num then true else if num mod divn = 0 then false else detPrime(num, divn+1); fun prime(num: int) = detPrime(num, 2
fun detPrime(num:int, divn:int) =
if divn = num
then true
else if num mod divn = 0
then false
else detPrime(num, divn+1);
fun prime(num: int) =
detPrime(num, 2);
fun goldbachHelp(num1: int, num2: int) =
if num2 > num1
then []
else if prime(num2) = true andalso prime(num1) = true
then num2::num1::[]
else goldbachHelp(num1-1, num2+1);
fun goldbach(num: int) =
if num mod 2 = 1
then []
else goldbachHelp(num, 0);
goldbach(100);
为什么这会导致溢出错误
更重要的是,你是如何发现的
溢出表示整数超出了Int.minInt
或Int.maxInt
的界限。你所做的就是在不同的地方增加和减少一个。因此,不知何故,最终应该终止这些增量和减量的条件没有得到满足。我稍微修改了您的代码,并在其中插入了一些打印语句:
fun detPrime (num, divn) =
num = divn orelse
num mod divn <> 0 andalso
detPrime (num, divn+1)
fun isPrime num =
( print ("isPrime(" ^ Int.toString num ^ ")\n")
; detPrime (num, 2)
)
fun goldbachHelp (num1, num2) =
( print ("goldbachHelp(" ^ Int.toString num1 ^ ", " ^ Int.toString num2 ^")\n")
; if num1 > num2
then []
else if isPrime num1 andalso isPrime num2
then [num2, num1]
else goldbachHelp(num1+1, num2-1)
)
fun goldbach num =
goldbachHelp (0, num)
这样看来,即使您可能使用合理的输入(num
≥ 2,因为根据定义这是最小的素数),goldbachHelp
设法用不合理的输入调用它:
goldbach 100 ~> goldbachHelp (0, 100)
~> if 0 > 100
then []
else if isPrime 0 andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if isPrime 0 andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if detPrime (0, 2) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if 0 = 2 orelse
0 mod 2 <> 0 andalso
detPrime (0, 3) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if false orelse
false andalso
detPrime (0, 3) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if false andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> goldbachHelp(1, 99)
~> if 1 > 99
then []
else if isPrime 1 andalso isPrime 99
then [99, 1]
else goldbachHelp(1+1, 99-1)
~> if isPrime 1 andalso isPrime 99
then [99, 1]
else goldbachHelp(1+1, 99-1)
~> ... you can see where this is going ...
isPrime 1 ~> detPrime (1, 2)
~> 1 = 2 orelse 1 mod 2 <> 0 andalso detPrime (1, 2+1)
~> 1 mod 2 <> 0 andalso detPrime (1, 2+1)
~> 1 <> 0 andalso detPrime (1, 2+1)
~> detPrime (1, 3)
~> 1 = 3 orelse 1 mod 3 <> 0 andalso detPrime (1, 3+1)
~> 1 mod 3 <> 0 andalso detPrime (1, 3+1)
~> 1 <> 0 andalso detPrime (1, 3+1)
~> detPrime (1, 4)
~> 1 = 4 orelse 1 mod 4 <> 0 andalso detPrime (1, 4+1)
~> 1 mod 4 <> 0 andalso detPrime (1, 4+1)
~> 1 <> 0 andalso detPrime (1, 4+1)
~> detPrime (1, 5)
~> ... you can see where this is going ...
goldbach 100 ~> goldbachHelp (0, 100)
~> if 0 > 100
then []
else if isPrime 0 andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if isPrime 0 andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if detPrime (0, 2) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if 0 = 2 orelse
0 mod 2 <> 0 andalso
detPrime (0, 3) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if false orelse
false andalso
detPrime (0, 3) andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> if false andalso isPrime 100
then [100, 0]
else goldbachHelp(0+1, 100-1)
~> goldbachHelp(1, 99)
~> if 1 > 99
then []
else if isPrime 1 andalso isPrime 99
then [99, 1]
else goldbachHelp(1+1, 99-1)
~> if isPrime 1 andalso isPrime 99
then [99, 1]
else goldbachHelp(1+1, 99-1)
~> ... you can see where this is going ...
fun isPrime num =
num > 1 andalso detPrime (num, 2)