0

私は次の再帰関数を持っています

public int Factorial(int number_to_calculate)
{
    if (StackChanged != null)
    {
        StackChanged(new CustomEventArgs(StackValue, Result));
    }

    System.Threading.Thread.Sleep(wait_time);
    if (number_to_calculate == 0)
    {
        StackValue--;
        return 1;
    }
    else
    {
        StackValue++;
        Result = (number_to_calculate * Factorial(number_to_calculate - 1));
    }

    if (StackChanged != null)
    {
        StackChanged(new CustomEventArgs(StackValue, Result));
    }
    StackValue--;
    System.Threading.Thread.Sleep(wait_time);
    return Result;
}

どうやら私のスーパーバイザーは私が2回のリターンを持っていても大丈夫ではありませんが、関数を再帰的にしたいと思っています。だから私は1回の返品で済みます。戻り値を1つだけにするために、gotoで始まるアキュムレータを使用しようとしましたが、関数がそれ自体を呼び出すたびにStackValueをインクリメントし、再帰が発生したときにデクリメントする必要があります。このように、いつ出てくるのかわかりません。

誰かアイデアはありますか?

4

3 に答える 3

3

関数に単一のreturnステートメントを持たせる最も簡単な方法は、返す値を変数に格納し、最後にそれを返すことです。したがって、次のように変換します。

int myFunc() {
    if (cond)
        return x;
    else
        return y;
}

このようなものに:

int myFunc() {
    int returnValue;
    if (cond)
        returnValue = x;
    else
        returnValue = y;
    return returnValue;
}

この原則は、returnステートメントを変数代入に変更するときに、残りのコードがスキップされるように条件が設定されていることに注意する限り、一般にどのメソッドにも適用できます。

ただし、このような要件はかなり恣意的です。一般に、再帰では複数のreturnステートメントが必要です。

于 2012-07-31T12:41:08.593 に答える
3

それ以外の

if (number_to_calculate == 0)
    {

        StackValue--;

        return 1;

    }...

行う

if (number_to_calculate == 0)
    {

       result = 1;

    }
于 2012-07-31T12:41:19.193 に答える
0
int Factorial(int number) 
        {
            int result = 1;
            StackValue++;
            if (StackChanged != null)
                StackChanged(new CustomEventArgs(StackValue, Result));

            if (number > 1) 
            {       
                System.Threading.Thread.Sleep(wait_time); 
                result = number * Factorial(number - 1);
            }

            StackValue--;
            if (StackChanged != null)
                StackChanged(new CustomEventArgs(StackValue, Result));

            return result;
        }
于 2012-07-31T13:01:23.943 に答える