用 C# 编写了一段代码.尝试递归计算列表的总和,但出现错误“由于堆栈溢出异常,进程已终止”
本文关键字:错误 于堆 终止 进程 栈溢出 异常 递归计算 列表 一段 代码 | 更新日期: 2023-09-27 18:34:56
这是我的代码:(这是一个函数(请尽快帮助我解决这个问题!
public static int sumlist(List<int> L,Node<int>p1)
{
int sum = 0;
p1 = L.GetFirst();
if (p1 == null)
return sum;
else
{
sum = sum + p1.GetInfo();
p1 = p1.GetNext();
return sumlist(L,p1);
}
}
在main
中,我创建了一个列表和一个节点,并将它们"发送"到函数。
请记住,每次调用函数时,都会将一个新条目推送到程序的调用堆栈中。每次函数返回时,该条目都会从堆栈中弹出。程序在将 main 方法推送到堆栈上时启动,并在堆栈为空时结束。另请记住,调用堆栈具有有限/固定的大小。如果你有太多的函数调用而没有返回,你可能会溢出堆栈......因此,StackOverflowException。
现在让我们看一下您的代码。在 sumList()
函数中,您可以像这样递归调用该函数:
return sumlist(L,p1);
它使用相同的L
列表变量,以及一个可能用于保存当前状态的p1
变量。但是,在函数的前面,您完全丢弃p1
可能碰巧包含的任何值,而无需使用这些信息:
p1 = L.GetFirst();
这意味着您为每个递归调用重新开始列表。您具有相同的列表和相同的中间状态。什么都没有改变。结果是你继续调用sumList()
,每次在调用堆栈中更深入地获取一个条目,直到它最终溢出。
除此之外,您的L
变量仅包含int
值。如果你真的想对一个List<int>
求和,你所要做的就是说return L.Sum();
。似乎你真正想要的是一个List<Node<int>>
.
您不断将节点设置为第一个 List 元素,因此该函数将继续调用自身,从而导致堆栈异常。使用类似以下内容:
int sumList(List<int> list)
{
int sum = 0;
foreach(int value in list)
sum += value;
return sum;
}