java - 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;
}
}
解决方案
由于评估顺序,代码无法正常工作。
说你打电话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
这也是错误的。
基本上,您不应该在递归方法中使用字段,除非值在递归期间不会更改,或者可能用于结果收集器。
推荐阅读
- php - 将所有小写字母转换为相应的小写字母
- node.js - Dockerfile 中的 Nodejs 端口更改
- vim - Nerdcommenter -- 只注释掉选中的文本
- ios - IOS:如何在 HTTP 请求中禁用 user_session
- android - 在 Android Studio 中使用“setImageResource”时如何动态访问图像?
- python - discord.py message.channel.send 不工作
- amazon-dynamodb - Dynamodb updateItem 在 putItem 后立即导致覆盖
- python - UTC到CST时间转换使用pytz python包
- node.js - 无法将缓冲区转换为 pdf
- java - Settings gradle、property gradle 和 build gradle 的区别