我对 SML 真的很陌生,我不知道如何得到相同的答案;
它类似于:3^4 < 32 但 3^5 > 32 所以我的答案是 4(3 的幂),同样如果我有数字 4 和 63 然后 4^2<63 但 4^3>63 所以我的答案是 2(4 的幂)。
我想出了以下代码
val log (b, n) =
let
val counter = ref b
val value = 0
in
while !counter > n do
( counter := !counter*b
value := !value + 1)
end;
所以这里的值(value)是我需要的答案,但我得到了很多错误。我知道我在很多地方都错了。任何帮助,将不胜感激。
我也许可以用正常的 ML 方式做到这一点,但我也想学习不纯的 ML ......
fun loghelper(x,n,b) = if x>n then 0 else (1+loghelper((x*b),n,b));
fun log(b,n) = loghelper(b,n,b);
好的,所以最后这里是 while 循环的正确代码,它也可以工作;
fun log (b, n) =
let
val counter = ref b
val value = ref 0
in
while (!counter <= n) do
(counter := !counter*b;
value := !value + 1);
!value
end;
最佳答案
您的代码中有几个问题:
错误:
val log (b, n) =
应该是 fun log (b, n) =
. fun
是一种方便的语法,可让您轻松定义函数。如果你想用 val
写这个你会写:val log = fn (b, n) =>
(在递归函数或具有多个柯里化(Currying)参数的函数的情况下,它会变得更加复杂)( counter := !counter*b;
value := !value + 1)
value
需要是 ref
: val value = ref 0
逻辑:
while
循环具有单位类型,因此您的函数返回 ()
(单元)。您可能想返回 !value
.为此,您需要在整个 while
之后添加一个分号。循环的东西,然后写!value
while !counter <= n do
value
应该从 1 开始(因为 counter
从 b
开始,并且 b
是 b
的第一次幂);或 counter
应该从 1 开始(因为 b
的零次方是 1)。您的功能版本也存在同样的问题。 关于while-loop - SML/NJ while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548139/