C#以相同的方法返回方法
示例-我无法想象下面提到的代码将如何工作,假设它有if-else情况,其中一个情况返回int值,其余情况返回方法()本身。有人能解释一下发生了什么吗C#以相同的方法返回方法,c#,C#,示例-我无法想象下面提到的代码将如何工作,假设它有if-else情况,其中一个情况返回int值,其余情况返回方法()本身。有人能解释一下发生了什么吗 public static int method(){ return method(); //how does this line work? } 这被称为递归——一种自身执行(可以多次执行)的方法。 递归的一个重要方面是它需要一个停止条件,否则它将是一个无限递归,并将创建一个运行时错误 您提供的代码将导致无限递归,因此最终(相当快,但仍
public static int method(){
return method(); //how does this line work?
}
这被称为递归——一种自身执行(可以多次执行)的方法。 递归的一个重要方面是它需要一个停止条件,否则它将是一个无限递归,并将创建一个运行时错误 您提供的代码将导致无限递归,因此最终(相当快,但仍然最终)您将得到一个
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);
}
Int64阶乘(int输入)
{
如果(输入<0)
{
抛出新ArgumentOutOfRangeException(“输入必须为0或更高”);
}
如果(输入<2)
{
返回1;
}
返回输入*阶乘(输入-1);
}
注:0!=1,负值对于阶乘无效,该方法返回Int64以避免数学溢出
现在,假设您使用数字3调用此方法:Factorial(3)
将返回3*Factorial(3-1)
类似地,
Factorial(2)
将返回2*Factorial(2-1)
Factorial(1)
将只返回1
把它们放在一起,
Factorial(3)
将返回3*2*1
,即3代码>这称为递归-一种自身执行的方法(可以多次执行)。
递归的一个重要方面是它需要一个停止条件,否则它将是一个无限递归,并将创建一个运行时错误
您提供的代码将导致无限递归,因此最终(相当快,但仍然最终)您将得到一个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);
}
Int64阶乘(int输入)
{
如果(输入<0)
{
抛出新ArgumentOutOfRangeException(“输入必须为0或更高”);
}
如果(输入<2)
{
返回1;
}
返回输入*阶乘(输入-1);
}
注:0!=1,负值对于阶乘无效,该方法返回Int64以避免数学溢出
现在,假设您使用数字3调用此方法:
Factorial(3)
将返回3*Factorial(3-1)
类似地,Factorial(2)
将返回2*Factorial(2-1)
Factorial(1)
将只返回1
把它们放在一起,Factorial(3)
将返回3*2*1
,即3代码>代码将被编译,但极有可能导致堆栈溢出。您基本上创建了一个,但没有退出子句,这很糟糕。要回答您的问题,将发生以下情况:
您正在调用该方法
该方法调用“一个方法”来创建一个结果,而该结果恰好是它自己
与2相同
与2相同
堆栈溢出:达到堆栈的最大大小
(注意:我这么说很可能是因为您可能会增大堆栈大小,并耗尽内存,或者另一个线程可能会首先终止,等等。)代码将编译,但很可能会导致堆栈溢出。您基本上创建了一个,但没有退出子句,这很糟糕。要回答您的问题,将发生以下情况:
您正在调用该方法
该方法调用“一个方法”来创建一个结果,而该结果恰好是它自己
与2相同
与2相同
堆栈溢出:达到堆栈的最大大小
(注意:我这么说很可能是因为您可能会增加堆栈大小,并耗尽内存,或者其他线程可能会先终止,等等)我认为它不起作用。您可以调用一个方法,该方法可以返回某些内容,但不能返回其本身。此方法必须返回一个int
。您在那里创建的是一个完美的系统。StackOverflowException
Generator它被称为递归函数,没有一些退出逻辑,它将填充应用程序的调用堆栈。我认为它不起作用。您可以调用一个方法,该方法可以返回某些内容,但不能返回其本身。此方法必须返回一个int
。您在那里创建的是一个完美的系统。StackOverflowException
生成器它被称为递归函数,没有一些退出逻辑,它将填充应用程序的调用堆栈