3

我编写此代码的目的是每次recurse()调用链时都会递增。但是,它会这样做(根据我在调试器中看到的)每次recurse()到达 return;,它会减少b. 如果您想了解我正在尝试做的事情,这是项目 euler #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;

}
4

3 回答 3

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);
    }
}
于 2012-12-27T15:49:48.627 回答
2

为了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使用新值更新您的:

chain = recurse(i,chain);
于 2012-12-27T15:53:34.983 回答
2

由于您的方法当前没有返回值,因此您可以使用返回值来表示步数。只需将 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);
    }
}
于 2012-12-27T15:54:06.977 回答