Java 返回将参考参数值弄乱的void

Java 返回将参考参数值弄乱的void,java,return,pass-by-reference,void,Java,Return,Pass By Reference,Void,我写这段代码的目的是在每次调用recurse()时增加链。但是,每次recurse()返回时,它都会这样做(从我在调试器中看到的情况来看);,它递减b的值。如果你想了解我要做的事情的背景,这是euler 14项目 尽管对整数的引用(通过值)传递给递归,但对象本身是不可变的。当您执行b++时,递增的值被分配给b,这是递归的本地值。返回后,该值立即返回调用者中未更改的b副本 您可以使bastatic int变量,并将其从recurse的参数列表中删除,以解决问题: private static i

我写这段代码的目的是在每次调用
recurse()
时增加链。但是,每次
recurse()
返回时,它都会这样做(从我在调试器中看到的情况来看);,它递减
b
的值。如果你想了解我要做的事情的背景,这是euler 14项目


尽管对
整数
的引用(通过值)传递给
递归
,但对象本身是不可变的。当您执行
b++
时,递增的值被分配给
b
,这是
递归
的本地值。返回后,该值立即返回调用者中未更改的
b
副本

您可以使
b
a
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);
    }
}

要在main方法中查看
b
的更新,需要在递归结束时返回更新:

private static int recurse(int a, int b) {
    b++;
    if(a==1) return b;
    else if(a%2==0) return recurse((a/2), b);
    else if(a%2==1) return recurse(((a*3)+1), b);
    return b;
}
在主方法中,您可以使用新值更新

chain = recurse(i,chain);

由于您的方法当前没有返回值,因此可以使用返回值表示步骤数。只需在每个递归步骤中添加1:

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

我找不到问题。无论如何,这个
递归(i,链)
永远不会更改
链的值,因为
整数
是不可变的。我想你认为
b++recurse()
内部的code>将更改它,但这只会影响局部变量
b
;的确为了进一步阅读关于不可变对象的主题:我尝试将
chain
设置为静态,并将recurse()中
b
的所有实例替换为
chain
。我得到了变量链的错误
非法修饰符,只允许final。
似乎我只能使它在方法之外保持静态。我有一个按顺序执行所有euler问题的主方法,因此我不希望在euler14之外添加任何与euler14有关的代码,除了它的初始调用。@JamesRoberts一个较差的替代方法是将
int[1]
数组作为
b
传递,而是递增
b[0]+
。数组是可变的,所以不需要静态变量。最后,另一个选项是使用
AtomicInteger
,一个包装
int
的可变类,并在其上提供线程安全操作(当然,您不需要任何线程安全)。b现在指的是什么?@jalynn2:我的错误,删除:)完美。我要是早点看到这个答案就好了。
private static int recurse(int a) {
    if(a==1) {
        return 1;
    }
    if(a%2==0) {
        return 1 + recurse(a/2);
    } else if(a%2==1) {
        return 1 + recurse((a*3)+1);
    }
}