我有一些计算幂的代码,通过调用square,cube和hypercube方法。当前立方体方法调用程序中的square方法,然后超立方体方法调用立方体方法。我想用对power方法的调用替换对cube和hypercube的调用,但我完全卡住了。
以下是运行正常的原始代码。
public int square( int x ){
int i = ( x*x );
return i;
}
public int cube( int x ){
int i = (x * square(x) );
return i;
}
public int hypercube( int x ){
int i = (x * cube(x) );
return i;
}
public int power(int x, int n){
int k;
if (n==2){
k = square(x);
}
else if (n==3){
k = cube(x);
}
else if (n==4){
k = hypercube(x);
}
else if (n==1){
k = x;
}
else {
k = 1;
for (int i = 0; i < n; i++) {
k *= x;
}
}
return k;
}现在就像我说的,我想用对幂方法的调用来替换立方体和超立方体方法中的调用,然后在幂方法中仍然有对square,cube等的调用。因此,我希望完全删除对这些方法的调用,因为我不再需要它们。这真的让我很烦。这是我到目前为止所拥有的,但它给了我StackOverFlowError。
public int square( int x, int n ){
int i = power( x, n );
return i;
}
public int cube( int x, int n ){
int i = power(x , n );
return i;
}
public int hypercube( int x, int n ){
int i = power(x , n );
return i;
}
public int power(int x, int n){
int k;
if (n==2){
k = square(x, n);
}
else if (n==3){
k = cube(x, n);
}
else if (n==4){
k = hypercube(x, n);
}
else if (n==1){
k = x;
}
else {
k = 1;
for (int j = 0; j < n; j++) {
k *= x;
}
}
return k;
}发布于 2013-11-21 07:20:59
首先,正如你已经认识到的那样,这是一种非常糟糕的做事方式。因此,任何其他阅读本文的人,除了通常呼吁避免重复发明轮子(除非是出于教育目的)之外,不要以这种方式实现您的求幂方法!
也就是说,你得到堆栈溢出的原因(如此恰当)是因为你有一个循环定义。要了解这一点,最简单的方法是尝试手动跟踪power的工作原理。假设我想运行power(3, 2)。会发生什么?power(3, 2)将其识别为n == 2的一个实例,因此转到square方法。但是,square方法依赖于power方法来完成任务,然后无限重复。因此,你会得到堆栈上堆积的函数调用,直到你耗尽空间。
顺便说一句,如果您正在考虑实现用于个人启迪的整数幂运算,您可能希望查看重复平方。它可以让你的代码更快(对数乘法运算,而不是线性乘法运算)。
发布于 2013-11-21 08:22:38
在我看来,这是一个无限的循环。如果为n=2,则power调用sqaure,而sqaure又调用power,n也不变。
当你处理无穷大时,你通常会得到StackOverFlowError。
幂(x,n)必须独立于立方体或平方,如果你想摆脱它们。
https://stackoverflow.com/questions/20109020
复制相似问题