静态变量在 java 中的递归调用中如何表现?
How does static variable behave in recursive call in java?
我正在使用递归方法进行计算,并且为了跟踪结果,我正在使用全局静态变量来存储结果。虽然,我的代码不正确,因为在考虑基本情况时。根据我的代码,power(2,3) 应该 return 4。如果我使用 dry 运行 方法检查。但实际上,ans 变量的值在整个执行过程中只改变一次。我的问题是,为什么 ans 的值没有得到更新,并且对于 n 的任何值和基数都是 2。我的答案总是 returned 作为基值本身。谁能调试我的代码并帮助我理解递归方法调用中全局静态变量的行为
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;
}
}
由于 order-of-evaluation,代码无法正常工作。
假设你打电话给 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)
时,ans
的值会在 在 调用 power()
方法之前计算。
现在,如果您改为编写 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
这也是错误的。
基本上,您不应在递归方法中使用字段,除非值在递归过程中不会更改,或者可能用于结果收集器。
我正在使用递归方法进行计算,并且为了跟踪结果,我正在使用全局静态变量来存储结果。虽然,我的代码不正确,因为在考虑基本情况时。根据我的代码,power(2,3) 应该 return 4。如果我使用 dry 运行 方法检查。但实际上,ans 变量的值在整个执行过程中只改变一次。我的问题是,为什么 ans 的值没有得到更新,并且对于 n 的任何值和基数都是 2。我的答案总是 returned 作为基值本身。谁能调试我的代码并帮助我理解递归方法调用中全局静态变量的行为
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;
}
}
由于 order-of-evaluation,代码无法正常工作。
假设你打电话给 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)
时,ans
的值会在 在 调用 power()
方法之前计算。
现在,如果您改为编写 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
这也是错误的。
基本上,您不应在递归方法中使用字段,除非值在递归过程中不会更改,或者可能用于结果收集器。