返回void搞乱参考参数值

Ben*_*ett 3 java return pass-by-reference void

我编写了这段代码,意图是每次recurse()调用链都会增加.然而,它(从我用调试器看到的)每次recurse()到达返回值时都会这样做,它会递减值b.如果您想了解我正在尝试做的事情,那么这就是项目征集#14.

http://projecteuler.net/problem=14

private static void euler14()
{
    int currentstart=1000000;
    int longest = 0;
    int current=0;
    Integer chain=0;
    for(int i = currentstart; i>0; i--)
    {
        recurse(i,chain);
        if(chain > current)
        {
            current=chain;
            longest=i;
        }
        chain = 0;
    }
    System.out.print("Euler 14: " + longest + "\n");
}

private static void recurse(int a, Integer b)
{
    b++;
    if(a==1)
    {
        return;
    }
    else if(a%2==0)
    {
        recurse((a/2), b);
    }
    else if(a%2==1)
    {
        recurse(((a*3)+1), b);
    }
    return;

}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

虽然引用Integer是通过(按值)传递的recurse,但对象本身是不可变的.执行此操作时b++,会将递增的值指定b为本地值recurse.一旦返回,该值将返回到b调用者中未更改的副本.

您可以创建b一个static int变量,并将其从参数列表中删除recurse以修复问题:

private static int b = 0;
private static void recurse(int a) {
    b++;
    if(a==1) {
        return;
    }
    if(a%2==0) {
        recurse((a/2), b);
    } else if(a%2==1) {
        recurse(((a*3)+1), b);
    }
}
Run Code Online (Sandbox Code Playgroud)