【问题标题】:elseif statement in Standard ML?标准 ML 中的 elseif 语句?
【发布时间】:2016-05-26 09:54:33
【问题描述】:

我正在做一个家庭作业问题来制作一个函数 sumOdd 来计算前 n 个奇数的总和,但我似乎找不到任何类型的 elseif 类型的语句来这样做。我试图做的是下面但当然不起作用:

fun sumOdd n = if n=0 then 0 elseif (n mod 2)=0 then sumOdd(n-1) elseif n + sumOdd(n-1);

【问题讨论】:

  • 尼特:ML中没有语句,一切都是表达式。
  • @AndreasRossberg 是 fun 不是声明吗?您不能将 fun 分配给变量(请参阅要点,例如:gist.github.com/eatonphil/83252c39ef39c9f6886550e1ca711ca1)。
  • @eatonphil, fun 两者都不是,它是一个声明。当我说“一切”时,它是在可能是一个陈述的背景下。当然还有其他各种语法类别,如声明、类型、模块等。

标签: sml smlnj


【解决方案1】:

您的函数未编译,因为elseif 不是 SML 中的关键字。将最后一个 elseif 更改为 else 并将其他 elseif 更改为 else if 应该可以修复错误。

此外,以下格式的函数更具可读性:

fun sumOdd n = if n = 0 then 0 
               else if n mod 2 = 0 then sumOdd(n-1) 
               else n + sumOdd(n-1)

【讨论】:

    【解决方案2】:

    您还可以通过将基本情况与一般情况分开来消除对 else if 表达式的需要:

    fun sumOdd 0 = 0 
      | sumOdd n = if n mod 2 = 0 then sumOdd(n-1)
                   else n + sumOdd(n-1)
    

    您还应该注意,此解决方案(以及您自己的解决方案)实际上并未将前 N 个奇数相加。它计算所有小于 N 的奇数之和。

    sumOdd(5) 在应该给25(1+3+5+7+9) 的时候给9(5+3+1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多