SML/NJ while 循环

Rit*_*uja 5 sml smlnj while-loop

我对 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;
Run Code Online (Sandbox Code Playgroud)

所以这里的值是我需要的答案,但我遇到了很多错误。我知道我很多地方都错了。任何帮助,将不胜感激。

我也许可以用正常的机器学习方式做到这一点,但我也想学习不纯的机器学习......

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);
Run Code Online (Sandbox Code Playgroud)

好的,最后这是 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;
Run Code Online (Sandbox Code Playgroud)

new*_*cct 5

您的代码中有几个问题:

错误:

  • 而不是val log (b, n) =应该是fun log (b, n) =fun是一种方便的语法,可让您轻松定义函数。如果你想这样写,val你可以写:(val log = fn (b, n) =>在递归函数或具有多个柯里化参数的函数的情况下,它会变得更加复杂)
  • 您需要一个分号来分隔两个命令式语句:( counter := !counter*b; value := !value + 1)
  • value需要是refval value = ref 0

逻辑:

  • 您的函数不返回任何内容。循环while具有单位类型,因此您的函数返回()(unit)。您可能想返回!value。为此,您需要在整个while循环后面添加一个分号,然后编写!value
  • 你的 while 循环条件实际上没有意义。看来是反了。你可能想要while !counter <= n do
  • 您的基本情况不正确。要么value应该从 1 开始(因为counter从 开始b,并且bb的一次方);或者counter应该从 1 开始(因为b0 次方是 1)。您的功能版本也存在同样的问题。