while-loop - SML/NJ while 循环

标签 while-loop sml smlnj

我对 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 循环条件并没有真正意义。好像反过来了。你可能想要 while !counter <= n do
  • 您的基本情况不正确。 value应该从 1 开始(因为 counterb 开始,并且 bb 的第一次幂);或 counter应该从 1 开始(因为 b 的零次方是 1)。您的功能版本也存在同样的问题。
  • 关于while-loop - SML/NJ while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548139/

    相关文章:

    recursion - 用函数式语言实现快速排序

    types - 标准毫升中的最大整数和最小整数

    int - 如何在 SML 中将 String 转换为 int(而不是 int 选项)

    functional-programming - 如何更新SML中的记录值?

    java - ANDROID - 在线程内循环

    JavaScript,while 循环

    javascript - 密码测试器,如果存在空格,则会提醒用户

    sml 理解函数组合

    sml - 在 sml 中匹配非穷举

    java - 4.23 Java 中匹配数字之前的实验倒计时