C# 递归添加数字时避免堆栈溢出

C# 递归添加数字时避免堆栈溢出,c#,stack-overflow,C#,Stack Overflow,我有一个递归函数,它在第一次递归调用时添加一个值number,在第二次递归调用时添加number-1,依此类推,直到它达到0。我已将此功能实现为: public static int func(int number, int retval=0) { if (number<=0) return retval; return func( number-1, retval+number ); } public static int func(int number

我有一个递归函数,它在第一次递归调用时添加一个值
number
,在第二次递归调用时添加
number-1
,依此类推,直到它达到0。我已将此功能实现为:

public static int func(int number, int retval=0)
{
    if (number<=0)
        return retval;
    return func( number-1, retval+number );
}
public static int func(int number,int retval=0)
{

如果(number在第一次递归调用中添加
number
,在第二次调用中添加
number-1
,依此类推,直到最后添加0并停止递归。因此,这相当于只返回
retval+number+(number-1)+…+1
retval+(number+1)*number/2

因此,通过将函数替换为以下内容,可以完全避免递归(以及堆栈溢出的可能性):

public static int func(int number, int retval=0)
{
    if (number<=0) {
        return retval;
    } else {
        return retval + (number+1)*number/2;
    }
}
public static int func(int number,int retval=0)
{

如果(number当您有一个类似于您的递归函数时,它不操作递归调用的结果,而只是将其返回给调用方,那么您可以使用合适的参数替换跳转到函数体的顶部来替换递归调用

对于您的功能:

public static int func(int number, int retval=0)
{
    if (number<=0)
        return retval;
    return func( number-1, retval+number );
}

它不再是递归的,也不会导致堆栈溢出。

如果必须使用递归,请向包含堆栈中剩余“空间”的函数中添加一个整数,类似于:

public static int func(int number, int retval=0, int numberOfCalls)
{
    if(numberOfCalls >= maximumBeforeStackOverflow)
    {
        //throw exception you can catch (you can't cath stackoverflow if i'm correct)
        //or break func
    }
    if (number<=0)
    {
        return retval;
    }
    return func( number-1, retval+number, numberOfCalls++ );
}
public static int func(int number,int retval=0,int numberOfCalls)
{
如果(numberOfCalls>=maximumBeforeStackOverflow)
{
//抛出您可以捕获的异常(如果我是正确的,则不能抛出堆栈溢出)
//或中断函数
}

如果(numberIt在这里不是关于文件的,它是关于递归的,它的深度足以耗尽堆栈。请让您的方法迭代(或者使用支持尾部递归的语言,如F#::)对不起,请你详细说明一下好吗?她的家庭作业是把一个递归变成一个迭代循环。这真的没有什么帮助。@HansPassant在作业问题第1版的什么地方陈述了她的作业?
public static int func(int number, int retval=0)
{
  while (! number<=0)
  {
    number = number - 1;
    retval = retval + number;
  }
  return retval;
}
public static int func(int number, int retval=0, int numberOfCalls)
{
    if(numberOfCalls >= maximumBeforeStackOverflow)
    {
        //throw exception you can catch (you can't cath stackoverflow if i'm correct)
        //or break func
    }
    if (number<=0)
    {
        return retval;
    }
    return func( number-1, retval+number, numberOfCalls++ );
}