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)
虽然引用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)