Scala递归:return vs if / else控制

时间:2014-08-08 00:33:32

标签: scala recursion

我正在研究“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
}

为什么我的第一次尝试无效?

2 个答案:

答案 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中是一个表达式,因此传递一个(类型化的)值。

考虑函数fg,如下所示,

def f() = if (1==2) "whow!"
f: ()Any

def g() = if (1==2) "whow!" else "ok!"
f: ()String

请注意推断的返回类型。在函数f中,假定else部分(未声明)返回Unit类型。因此,在这种情况下,UnitString之间的兼容类型为Any

这与函数g形成对比,其中类型只是String