首页 > 解决方案 > java中的递归调用中静态变量的行为如何?

问题描述

我正在使用递归方法来计算,并且为了跟踪结果,我正在使用全局静态变量来存储结果。虽然,我的代码是不正确的,因为在考虑基本情况时。根据我的代码,power(2,3) 应该返回 4。如果我使用空运行方法进行检查。但实际上,ans变量的值在整个执行过程中只改变一次。我的问题是,为什么 ans 的值没有得到更新,并且对于任何 power n 值和 base 为 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;
        
    }
}

标签: javarecursionstaticstatic-variables

解决方案


由于评估顺序,代码无法正常工作。

说你打电话power(3, 4)

ans = 1
power(3, 4):
  ans=ans*power(x,n-1)  ->  1*power(3,4-1)
  power(3, 3):
    ans=ans*power(x,n-1)  ->  1*power(3,3-1)
    power(3, 2):
      ans=ans*power(x,n-1)  ->  1*power(3,2-1)
      power(3, 1):
        return 3
      ans=1*power(3,2-1) =1*3 =3
      return ans  ->  return 3
    ans=1*power(3,3-1) =1*3 =3
    return ans  ->  return 3
  ans=1*power(3,4-1) =1*3 =3
  return ans  ->  return 3

Result is:
  ans = 3
  return 3

这是因为,当您编写 时,会在调用方法之前评估的ans=ans*power(x,n-1)值。anspower()

现在,如果您ans=power(x,n-1)*ans改为编写代码,代码将变成这样:。

ans = 1
power(3, 4):
  ans=power(x,n-1)*ans  ->  power(3,4-1)
  power(3, 3):
    ans=power(x,n-1)*ans  ->  power(3,3-1)
    power(3, 2):
      ans=power(x,n-1)*ans  ->  power(3,2-1)
      power(3, 1):
        return 3
      ans=power(3,2-1)*ans =3*1 =3
      return ans  ->  return 3
    ans=power(3,3-1)*ans =3*3 =9
    return ans  ->  return 9
  ans=power(3,4-1)*ans =9*9 =81
  return ans  ->  return 81

Result is:
  ans = 81
  return 81

这也是错误的。

基本上,您不应该在递归方法中使用字段,除非值在递归期间不会更改,或者可能用于结果收集器。


推荐阅读