Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,静态变量在递归调用中的行为如何?_Java_Recursion_Static_Static Variables - Fatal编程技术网

在java中,静态变量在递归调用中的行为如何?

在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

我使用递归方法来计算,为了跟踪结果,我使用一个全局静态变量来存储结果。尽管如此,我的代码是不正确的,就像考虑基本情况一样。根据我的代码,幂(2,3)应该返回4。如果我使用干运行方法进行检查。但是实际上,ans变量的值在整个执行过程中只改变一次。我的问题是,为什么ans的值没有得到更新,对于幂n的任何值,基数为2。我的答案总是作为基值本身返回。有人能调试我的代码并帮助我理解递归方法调用中全局静态变量的行为吗

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使用局部变量。