Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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#_Recursion_Stack Overflow - Fatal编程技术网

C# 使用递归函数时堆栈溢出

C# 使用递归函数时堆栈溢出,c#,recursion,stack-overflow,C#,Recursion,Stack Overflow,我正在尝试做一个简单的编码挑战,要求我做以下工作: 如果给定n,则返回一个数组ans,其组成方式如下: `ans = [n, n - 5, n - 10, ... , m, m + 5, ... , n - 5, n]`, where m stands for the first non-positive integer obtained by subtractions. 试着在没有任何循环的情况下解决它 范例 对于n=25,输出应为 listWithoutLoop(n) = [25, 20,

我正在尝试做一个简单的编码挑战,要求我做以下工作:

如果给定n,则返回一个数组ans,其组成方式如下:

`ans = [n, n - 5, n - 10, ... , m, m + 5, ... , n - 5, n]`, where m stands for the first non-positive integer obtained by subtractions.
试着在没有任何循环的情况下解决它

范例

对于
n=25
,输出应为

listWithoutLoop(n) = [25, 20, 15, 10, 5, 0, 5, 10, 15, 20, 25].
我已经完成了以下代码:

int[] listWithoutLoop(int n)
{
    List<int> test = new List<int>();

    if (test.Count > 2 && test[test.Count - 1] == n)
        return test.ToArray();

    if (n <= 0)
    {
        test.Add(n + 5);
        return listWithoutLoop(n + 5);
    }
    else
    {
        test.Add(n - 5);
        return listWithoutLoop(n - 5);
    }
}
int[]列表不带循环(int n)
{
列表测试=新列表();
如果(test.Count>2&&test[test.Count-1]==n)
返回测试。ToArray();

如果(n您必须在
listWithoutLoop()
方法上方定义
test
列表

List<int> test = new List<int>();
int[] listWithoutLoop(int n)
{
....
}
List test=newlist();
int[]无循环列表(int n)
{
....
}

为了简化,我将函数拆分为分别累加和累加(最好始终使用简单易懂的代码)

static void Main()
{
int n=20;
整数区间=5;
列表=新列表();
AddDown(列表,n,0,间隔);
相加(列表,0,n,间隔);
int[]arrInt=list.ToArray();
}
静态void AddDown(列表列表、int currentNumber、int targetNumber、int interval)
{
如果(当前编号>目标编号)
{
列表。添加(当前编号);
下拉列表(列表,当前编号-间隔,目标编号,间隔);
}
}
静态无效加总(列表列表、int currentNumber、int targetNumber、int interval)
{

if(currentNumber)您在每次递归调用中不断重新创建
test
,因此
test.Count>2
始终为false,因此您永远不会到达基本情况。递归中的堆栈溢出总是因为同一件事:永远不会达到退出条件。如果将
List test=new List();
移到
int[]listWithoutLoop(int n)
?最后一部分:当然,C支持递归。您是否用其他语言尝试过代码?它会引发相同的错误。请将函数的list参数设置为,并将其传递给每个递归调用。
    static void Main()
    {
        int n = 20;
        int interval = 5;

        List<int> list = new List<int>();
        AddDown(list, n, 0, interval);
        AddUp(list, 0, n, interval);

        int[] arrInt = list.ToArray();

    }

    static void AddDown(List<int> list, int currentNumber, int targetNumber, int interval)
    {
        if(currentNumber > targetNumber)
        {
            list.Add(currentNumber);
            AddDown(list, currentNumber - interval, targetNumber, interval);
        }
    }

    static void AddUp(List<int> list, int currentNumber, int targetNumber, int interval)
    {
        if (currentNumber <= targetNumber)
        {
            list.Add(currentNumber);
            AddUp(list, currentNumber + interval, targetNumber, interval);
        }
    }