这里是Math.Pow类的工作递归功能函数:
public class Powers {
public static long pow(long x, long p) {
if (p == 0) {
return 1;
}
if (p % 2 == 0) {
long a = pow(x, (p / 2));
return a * a; //This line
} else {
long a = pow(x, ((p - 1) / 2));
return x * a * a; //This line
}
}
}
如果我通过将上面提到的行更改为return pow(a, 2)
和return x * pow(a, 2)
来尝试变得聪明并尽可能多地使用递归,则会出现堆栈溢出错误。我知道它应该会导致对pow
的更多调用,但我认为它不应该像它看起来那样循环。任何人都可以解释我吗?感谢
答案 0 :(得分:1)
执行此操作,您将获得以下一系列调用:
pow(a, 2) -> pow(a, 1) -> pow(a, 0) -> pow(1, 2) -> pow(1, 1) -> pow(1, 0) -> pow(1, 2) -> ...
答案 1 :(得分:0)
您应该使用某个IDE调试它,或者只是在方法的开头添加一些表达式:
public static long pow(long x, long p) {
System.out.println ("x = " + x + ", p = " + p);
...
然后,读取输出,它将包含pow