我有这个功能来递归地计算x
n
的力量:
def pow(x:Double,n:Int):Double={
if (n==0) 1
else if (n<0) 1/pow(x,-n)
else if (n%2 == 1) x*pow(x,n-1)
else pow(pow(x,n/2),2)
}
但这不适用于最后一种情况(即正数偶数)。它只是挂在那里。 但是,如果我这样做:
def pow(x:Double,n:Int):Double={
if (n==0) 1
else if (n<0) 1/pow(x,-n)
else if (n%2 == 1) x*pow(x,n-1)
else {val y=pow(x,n/2); y*y}
}
按预期运行。谁能告诉我是什么让第一个实现错误。我试图回答“ Scala For Impatient ”一书第2章中的问题10。
答案 0 :(得分:3)
在某些时候你的方法最终会做:
pow(pow(x,1),2) -> pow(x*pow(x,0),2) -> pow(x,2) -> pow(pow(x,1),2) -> ...
这是因为n == 2仅由最后一个条件处理,最后一次又一次地调用自己......
答案 1 :(得分:2)
你总是在最后一种情况下调用pow(...,2)
,最后一种情况是唯一一个处理n==2
的情况。所以....