3

私は自分自身を再帰的に呼び出す関数を持っています:

public int foo(int num, int counter)
{
    if (num > 0)
    {
        counter++;
        num--;
        foo(num, counter);
    }

    return counter;
}

main メソッドから、次のように関数を呼び出します。

System.out.println(bst.foo(3, 0));

私はそのような行動を期待しています:

public int foo(int num, int counter)
{
    // counter = 0
    // num = 3
    if (num > 0)
    {
        counter++; // counter = 1
        num--; // num = 2
        if (num > 0)
        {
            counter++; // counter = 2
            num--; // num = 1
            if (num > 0)
            {
                counter++; // counter = 3
                num--; // num = 0
                if (num > 0)
                {
                    // don't execute as num = 0
                }
            }
        }
    }

    return counter; // return 3
}

しかし、関数は常に戻ります1が、その理由はわかりません。

4

1 に答える 1

8

変数自体ではなく、のを渡しています。再帰呼び出しは、外側の呼び出しでcounterの値を変更できません。counterJava は値渡しです。

考えられる解決策の1つは、

 counter = foo(num, counter);

再帰呼び出しで。または、代わりに、単に、後で返す以外return foo(num, counter)は何もしないためです。counter

于 2013-02-07T21:22:01.880 に答える