用 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中,我创建了一个列表和一个节点,并将它们"发送"到函数。

用 C# 编写了一段代码.尝试递归计算列表的总和,但出现错误“由于堆栈溢出异常,进程已终止”

请记住,每次调用函数时,都会将一个新条目推送到程序的调用堆栈中。每次函数返回时,该条目都会从堆栈中弹出。程序在将 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;
}
相关文章: