无限递归函数

时间:2013-12-08 20:19:11

标签: scala recursion

在解决“Scala for Impatient”中的问题时,我遇到了一个场景,我将函数转换为无限递归调用,但我不知道为什么。

问题是:

Write a function that computes x^n, where n is an integer. Use
the following recursive definition:

x^n = y^2 if n is even and positive, where y = x^(n / 2)
x^n = x·x^(n – 1) if n is odd and positive
x^0 = 1
x^n = 1 / x^–n if n is negative

Don’t use a return statement.

我的答案是:

def positive(n: Int) = n > 0
def even(n: Int) = n % 2 == 0 
def odd(n: Int) = !even(n)

def power(x: Double, n: Int) : Double = {
    if (positive(n) && even(n)){
        val y = power(x, n/2)
        power(y, 2)     // problematic part, if substituted by `y * y` it works, WHY??
    }else if (positive(n) && odd(n)){
        x * power(x, n-1)
    }else if (n == 0){
        1
    }else{
        1 / power(x, -n) 
    }
}

2 个答案:

答案 0 :(得分:2)

让我们考虑一个简单的案例:

power(1, 2)

2是正面和均匀的,所以它会调用

power(1, 1)
power(power(1, 1), 2)

第一个是正面和奇数,所以我们得到

1 * power(1, 0)
power(1 * power(1, 0), 2)

现在n为零,所以我们得到

1
power(1 * 1, 2)

简化为

power(1, 2)

这是我们开始的,所以我们将再次循环所有内容。

答案 1 :(得分:1)

致电power(y,2)时,您恰好用n = 2回电,正极甚至再次=>无限循环。