在解决“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)
}
}
答案 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
回电,正极甚至再次=>无限循环。