使用递归函数时堆栈溢出

时间:2017-12-14 12:51:04

标签: 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, 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);
    }
}

但是我在运行时不断出现堆栈溢出。 c#是否支持递归?如果是这样,如何防止在运行时出现stackoverflow异常?

2 个答案:

答案 0 :(得分:0)

您必须在test方法上方定义listWithoutLoop()列表。

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

答案 1 :(得分:-1)

为了简化,我将功能拆分为单独添加和添加(总是更好地拥有简单易懂的代码)

    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);
        }
    }