比较没有if语句的整数?

时间:2011-09-13 19:37:02

标签: scala match

对于家庭作业,我被要求以非递减顺序合并两个整数列表。我们被告知不要“不使用if运算符。”

我可以毫无困难地通过递归合并两个列表(如果我忽略非递减部分),但是如何比较每个列表中的一个整数而不使用if语句?从我所看到的,Scala匹配功能不允许使用表达式,但我不确定如何在这种情况下使用它。

不一定要寻找明确的答案/代码示例,只是寻找正确方向的提示。

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用maxmin方法,以便以正确的非递减顺序将两个数字都包含在结果中。一定要证明(至少对你自己)这在所有情况下都有效。

答案 1 :(得分:2)

有很多方法可以在不使用if语句的情况下执行此操作,但仍然需要比较数字。这只是将隐含的if语句隐藏在其他东西之后。

面向对象语言中if语句的一种替代方法是多态。考虑一下:

sealed trait Bool
object Bool {
  def apply(b: Boolean): Bool = b match {
    case true /* Implicit if! */ => True
    case false                   => False
object True extends Bool
object False extends Bool

Boolean您可以构建Bool(使用隐式if,已授予)。然后,您可以向Bool添加方法,为每个object实施不同的方法。顺便说一句,这就是Option的工作原理。 None有一个实现,Some有另一个。

然而,有一种方法可以避免比较数字。如果不进行比较,则不要使用if - 甚至不要隐式使用{{1}}。有趣的事实:80年代的计算机杂志有一个排序算法的竞赛,其胜利者将是比较最少时间的算法。获胜算法完全排序而不进行比较,然后进行虚拟比较只是为了保持在比赛规则之内。

这里的提示是你必须知道数字的范围是什么,并且该范围不能太大,否则,你将不得不做多次通过来完成订购。此外,列表执行操作效率很低。

我希望这会有所帮助。

答案 2 :(得分:2)

不要这样做。但是,有趣的是,它有效。我们假设您正在比较x和y。

val okay = Array(0,1)
try {
  b(math.signum(x.toLong - y.toLong).toInt)
  // Handle x >= y case here
}
catch { case _ =>
  // Handle x < y case here
}

你也可以

val handler = Array(
  () => {
    // Handle x < y
  },
  () => {
    // Handle x == y
  },
  () => {
    // Handle x > y
  }
)
handler(math.signum(x.toLong-y.toLong).toInt+1)()

稍微不那么傻(但仍然相当愚蠢)。