我是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;
所以这里的价值就是我的答案,但是我得到了很多错误。我知道我在很多地方都错了。任何帮助将不胜感激。
我也许可以用普通的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;
答案 0 :(得分:3)
您的代码中有几个问题:
错误:
val log (b, n) =
,它应该是fun log (b, n) =
。 fun
是一种便捷语法,可让您轻松定义函数。如果你想用val
写这个,你会写:val log = fn (b, n) =>
(在递归函数或带有多个curried参数的函数的情况下会变得更复杂)( 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
到第0次幂为1)。您的功能版本也存在同样的问题。