Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#以相同的方法返回方法_C# - Fatal编程技术网

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

C#以相同的方法返回方法,c#,C#,示例-我无法想象下面提到的代码将如何工作,假设它有if-else情况,其中一个情况返回int值,其余情况返回方法()本身。有人能解释一下发生了什么吗 public static int method(){ return method(); //how does this line work? } 这被称为递归——一种自身执行(可以多次执行)的方法。 递归的一个重要方面是它需要一个停止条件,否则它将是一个无限递归,并将创建一个运行时错误 您提供的代码将导致无限递归,因此最终(相当快,但仍

示例-我无法想象下面提到的代码将如何工作,假设它有if-else情况,其中一个情况返回int值,其余情况返回方法()本身。有人能解释一下发生了什么吗

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
    生成器它被称为递归函数,没有一些退出逻辑,它将填充应用程序的调用堆栈