3

recurse()が呼び出されるたびにチェーンがインクリメントされるように、このコードを書きました。ただし、これは (デバッガーで見たものから) return; に到達するたびrecurse()に、 の値を減らします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++割り当てられます。戻るとすぐに、値は呼び出し元の の変更されていないコピーに戻ります。brecurseb

変数を作成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 に答える