C#以相同的方法返回方法

时间:2018-05-26 04:20:58

标签: c#

示例 - 我无法想象下面提到的代码如何工作,假设它有另外一种情况,其中一个案例返回int值,其余的返回方法()本身。有人可以解释会发生什么吗?

public static int method(){
    return method(); //how does this line work?
}

2 个答案:

答案 0 :(得分:2)

这称为递归 - 一种自我执行的方法(可以多次)。 关于递归的一个重要的事情是它需要一个停止条件,否则它是一个无限递归并且会产生运行时错误。

您提供的代码将导致无限递归,因此最终(非常快,但最终)您将获得StackOverflowException

递归的典型例子是计算阶乘(如果你不记得它是如何工作的,5!= 5 * 4 * 3 * 2 * 1)。

因此,阶乘递归方法的实现将是这样的:

Int64 Factorial(int input)
{
    if(input < 0) 
    {
         throw new ArgumentOutOfRangeException("Input must be 0 or higher.");
    }
    if(input < 2) 
    {
        return 1;
    }
    return input * Factorial(input - 1);
}

注意:0! = 1,负值对于factorial无效,并且该方法返回Int64以避免数学溢出。

现在,假设您使用数字3调用此方法:
Factorial(3)将返回3 * Factorial(3-1) 同样,Factorial(2)将返回2 * Factorial(2-1) Factorial(1)只会返回1 将所有内容Factorial(3)放在一起将返回3 * 2 * 1 3!

答案 1 :(得分:0)

代码会编译,但最有可能导致堆栈溢出。你基本上创建了一个recursive function,没有一个退出子句,这很糟糕。要回答你的问题,会发生什么:

  1. 你正在调用这个方法。
  2. 该方法调用“方法”来创建结果,结果恰好是自身。
  3. 与2相同。
  4. 与2相同。
  5. ...

    Stack Overflow:你达到了堆栈的最大大小。

    (注意:我说很可能是因为你可以增加堆栈大小,内存耗尽,或者其他线程可以先终止,等等。)