对于家庭作业,我被要求以非递减顺序合并两个整数列表。我们被告知不要“不使用if运算符。”
我可以毫无困难地通过递归合并两个列表(如果我忽略非递减部分),但是如何比较每个列表中的一个整数而不使用if语句?从我所看到的,Scala匹配功能不允许使用表达式,但我不确定如何在这种情况下使用它。
不一定要寻找明确的答案/代码示例,只是寻找正确方向的提示。
感谢。
答案 0 :(得分:4)
您可以使用max
和min
方法,以便以正确的非递减顺序将两个数字都包含在结果中。一定要证明(至少对你自己)这在所有情况下都有效。
答案 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)()
稍微不那么傻(但仍然相当愚蠢)。