静态变量永远不会被更新。

huangapple go评论65阅读模式
英文:

Static variable never get updated

问题

我试图为 ans 变量赋一个新值,但它从未被更新。我运行了许多输入 (x, n),但显示的结果始终是 x 的最终答案。有人可以解释一下吗?

public class Solution {

    static int ans = 1;
    public static int power(int x, int n) {

        if(n==0)
            return 1;
        if(n==1)
            return x;

        ans = ans * power(x,n-1);
 
        return ans;
    }
}
英文:

I am trying to assign a new value to the ans variable but it never gets updated. I run many input (x, n) but showing result x final answer. Can someone explain?

public class Solution {

    static int ans = 1;
    public static int power(int x, int n) {

        if(n==0)
            return 1;
        if(n==1)
            return x;

        ans = ans * power(x,n-1);
 
        return ans;
    }
}

答案1

得分: 3

一个静态变量与类本身相关联。在存在该类的多个实例的情况下,静态变量对所有实例都是共用的。然而,在递归过程中,对于每个函数调用,都会将一个新的堆栈帧推入堆栈内存,并包含该方法内的所有变量。

在你的情况下,变量 ans 将会被复制到堆栈中,为每个递归函数调用创建多个副本(是的,即使是静态变量也是如此)。因此,如果在堆栈中的递归调用中修改了 ans,则调用函数(父函数)中的 ans 值不会受到影响。

对于 power(2,3),会发生以下情况:

power(2,3) ans=1
        power(2,2) ans=1
                power(2,1) ans=1 -> 返回 2
        ans * 2 -> 返回 2,因为 ans 仍为 1
ans * 2 -> 返回 2,因为 ans 仍为 1

这是你的函数的简化版本,不使用额外的变量:

public static int power(int x, int n) {
    if (n == 0)
        return 1;
    if (n == 1)
        return x;
    return x * power(x, n - 1);
}
英文:

A static variable is associated to the class itself. In case of more instances of that class, a static variable is common to all instances. However, during recursion, for each function call a new stack frame is pushed onto the stack memory with all the variables inside that method.

In your case the variable ans will be copied to the stack for each recursive function call creating multiple copies (yes even if static). So if ans is modified in the stack by a recursive call, the value of ans in the (parent) calling function is not affected.

For power(2,3) this is what happens:

power(2,3) ans=1
        power(2,2) ans=1
                power(2,1) ans=1 -> returns 2
        ans * 2 -> returns 2 because ans is still 1
ans * 2 -> returns 2 because ans is still 1

This is a simplified version of your function without using the extra variable:

public static int power(int x, int n) {
    if (n == 0)
        return 1;
    if (n == 1)
        return x;
    return x * power(x, n - 1);
}

答案2

得分: 1

你的静态变量不是问题。

代码应该是:

ans = x * power(x, n-1);
英文:
  1. Your static variable is not the problem.

The code should be:

ans = x * power(x, n-1);

huangapple
  • 本文由 发表于 2020年8月29日 15:42:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/63644650.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定