静态变量在Java的递归调用中如何表现?

问题描述

我正在使用递归方法来计算并跟踪结果,我正在使用全局静态变量来存储结果。虽然,我的代码是不正确的,因为考虑基本情况。根据我的代码,power(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;
        
    }
}

解决方法

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

说您叫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,3-1)
    power(3,2):
      ans=ans*power(x,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)时,将在调用ans方法之前评估power()的值。

现在,如果您改为编写ans=power(x,n-1)*ans,则代码将像这样流动:

ans = 1
power(3,4):
  ans=power(x,n-1)*ans  ->  power(3,3):
    ans=power(x,2):
      ans=power(x,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

这也是错误的。

基本上,除了在递归过程中不会更改的值(或可能用于结果收集器的值)外,不应在递归方法中使用字段。