C# 使用递归函数时堆栈溢出
我正在尝试做一个简单的编码挑战,要求我做以下工作: 如果给定n,则返回一个数组ans,其组成方式如下: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,
`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);
}
}