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 个返回,但希望函数是递归的。所以我只需要一个回报。我已经尝试使用带有 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 语句更改为变量赋值时,你已经设置了条件,因此跳过了其余代码。

然而,这样的要求是相当随意的。一般来说,递归预计会有多个返回语句。

于 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 回答