在java中,静态变量在递归调用中的行为如何?
我使用递归方法来计算,为了跟踪结果,我使用一个全局静态变量来存储结果。尽管如此,我的代码是不正确的,就像考虑基本情况一样。根据我的代码,幂(2,3)应该返回4。如果我使用干运行方法进行检查。但是实际上,ans变量的值在整个执行过程中只改变一次。我的问题是,为什么ans的值没有得到更新,对于幂n的任何值,基数为2。我的答案总是作为基值本身返回。有人能调试我的代码并帮助我理解递归方法调用中全局静态变量的行为吗在java中,静态变量在递归调用中的行为如何?,java,recursion,static,static-variables,Java,Recursion,Static,Static Variables,我使用递归方法来计算,为了跟踪结果,我使用一个全局静态变量来存储结果。尽管如此,我的代码是不正确的,就像考虑基本情况一样。根据我的代码,幂(2,3)应该返回4。如果我使用干运行方法进行检查。但是实际上,ans变量的值在整个执行过程中只改变一次。我的问题是,为什么ans的值没有得到更新,对于幂n的任何值,基数为2。我的答案总是作为基值本身返回。有人能调试我的代码并帮助我理解递归方法调用中全局静态变量的行为吗 public class Solution { static int ans=1
public class Solution {
static int ans=1;
public static int power(int x, int n) {
/* Your class should be named Solution
* Don't write main().
* Don't read input, it is passed as function argument.
* Return output and don't print it.
* Taking input and printing output is handled automatically.
*/
if(n==0)
return 1;
if(n==1)
return x;
else
ans=ans*power(x,n-1);
return ans;
}
}
由于计算顺序的原因,代码无法正常工作 假设您呼叫电源(3,4)
ans=1
功率(3,4):
ans=ans*功率(x,n-1)->1*功率(3,4-1)
功率(3,3):
ans=ans*功率(x,n-1)->1*功率(3,3-1)
功率(3,2):
ans=ans*功率(x,n-1)->1*功率(3,2-1)
功率(3,1):
返回3
ans=1*功率(3,2-1)=1*3=3
返回ans->返回3
ans=1*功率(3,3-1)=1*3=3
返回ans->返回3
ans=1*功率(3,4-1)=1*3=3
返回ans->返回3
结果是:
ans=3
返回3
这是因为,当您编写ans=ans*power(x,n-1)
时,ans
的值在调用power()
方法之前进行计算
现在,如果您编写的是ans=power(x,n-1)*ans
,那么代码将如下所示:
ans=1
功率(3,4):
ans=功率(x,n-1)*ans->功率(3,4-1)
功率(3,3):
ans=功率(x,n-1)*ans->功率(3,3-1)
功率(3,2):
ans=功率(x,n-1)*ans->功率(3,2-1)
功率(3,1):
返回3
ans=功率(3,2-1)*ans=3*1=3
返回ans->返回3
ans=功率(3,3-1)*ans=3*3=9
返回ans->返回9
ans=功率(3,4-1)*ans=9*9=81
返回ans->返回81
结果是:
ans=81
返回81
这也是错误的
基本上,您不应该在递归方法中使用字段,除了在递归过程中不会更改的值,或者可能用于结果收集器的值。由于计算顺序的原因,代码无法正常工作 假设您呼叫电源(3,4)
ans=1
功率(3,4):
ans=ans*功率(x,n-1)->1*功率(3,4-1)
功率(3,3):
ans=ans*功率(x,n-1)->1*功率(3,3-1)
功率(3,2):
ans=ans*功率(x,n-1)->1*功率(3,2-1)
功率(3,1):
返回3
ans=1*功率(3,2-1)=1*3=3
返回ans->返回3
ans=1*功率(3,3-1)=1*3=3
返回ans->返回3
ans=1*功率(3,4-1)=1*3=3
返回ans->返回3
结果是:
ans=3
返回3
这是因为,当您编写ans=ans*power(x,n-1)
时,ans
的值在调用power()
方法之前进行计算
现在,如果您编写的是ans=power(x,n-1)*ans
,那么代码将如下所示:
ans=1
功率(3,4):
ans=功率(x,n-1)*ans->功率(3,4-1)
功率(3,3):
ans=功率(x,n-1)*ans->功率(3,3-1)
功率(3,2):
ans=功率(x,n-1)*ans->功率(3,2-1)
功率(3,1):
返回3
ans=功率(3,2-1)*ans=3*1=3
返回ans->返回3
ans=功率(3,3-1)*ans=3*3=9
返回ans->返回9
ans=功率(3,4-1)*ans=9*9=81
返回ans->返回81
结果是:
ans=81
返回81
这也是错误的
基本上,您不应该在递归方法中使用字段,除了在递归过程中不会更改的值,或者可能用于结果收集器的值。在else语句
ans=…
中的变量ans
在计算最后一次幂(x,n-1)
之前不会更新。第一次求值将是x
,因为在n==1的情况下返回该值。在此之后,所有挂起的ans=ans*power(…)
求值将计算ans=1*x
。您应该为ans使用一个局部变量。在else语句ans=…
中的变量ans
直到最后一次power(x,n-1)
求值后才会更新。第一次求值将是x
,因为在n==1的情况下返回该值。在此之后,所有挂起的ans=ans*power(…)
求值将计算ans=1*x
。您应该为ans使用局部变量。