我正在研究“Scala for the Impatient”,其中一个练习要求编写一个函数来计算x^n
(通过repeated squaring的方法)而不使用return
关键词。我的第一个想法如下:
def power(x: Double, n: Int): Double = {
if(n > 0) {
if (n % 2 != 0) x * power(x, n-1) // adding a return works!
else power(x, n/2) * power(x, n/2) // adding a return works!
}
if(n < 0) 1/power(x, -n) // adding a return works!
else 1.0 // adding a return works!
}
然而,这不起作用!什么工作,是为每个案例添加回报。还有以下几点:
def power(x: Double, n: Int): Double = {
if(n > 0) {
if (n % 2 != 0) x * power(x, n-1)
else power(x, n/2) * power(x, n/2)
}
else if(n < 0) 1/power(x, -n)
else 1.0
}
为什么我的第一次尝试无效?
答案 0 :(得分:3)
如果n > 0
,则n < 0
为false,以便执行else 1.0
因此,如果1.0
,则不应执行n > 0
。
if(n > 0) {
if (n % 2 != 0) x * power(x, n-1)
else power(x, n/2) * power(x, n/2)
}
else if(n < 0) 1/power(x, -n)
else 1.0
答案 1 :(得分:1)
请注意,在第一个示例中,第一个if
是空的,因为它对power
的整体计算没有影响,因为它与其他if-else
表达式无关( s)在主体中:返回上一个if-else
的值。
作为附注,在Scala if-else
中是一个表达式,因此传递一个(类型化的)值。
考虑函数f
和g
,如下所示,
def f() = if (1==2) "whow!"
f: ()Any
def g() = if (1==2) "whow!" else "ok!"
f: ()String
请注意推断的返回类型。在函数f
中,假定else
部分(未声明)返回Unit
类型。因此,在这种情况下,Unit
和String
之间的兼容类型为Any
。
这与函数g
形成对比,其中类型只是String
。