【问题标题】:StackOverflowException when I call the same function many times当我多次调用同一个函数时出现 StackOverflowException
【发布时间】:2019-08-10 06:14:27
【问题描述】:

我正在创建一个函数,该函数在特定坐标中创建一个点,它调用自身移动到每个基点(直到一个特定的限制)。

存储超过 5000 个位置时出现 StackOverflowException 错误。

更简单:我创建了坐标仅向北移动的点,但仍然给出相同的错误

*NorthLimit、LatitudeDeviation 和 LongitudeDeviation 是常数。

public void CreatePosition(decimal latitude, decimal longitude)
{
    boolean end = true;

    Positions.Add(new Position(latitude, longitude));

    if (NorthLimit > (latitude + LatitudeDeviation))
    {
      CreatePosition(latitude + LatitudeDeviation, longitude);
      end = false;
    }

    if (end == true)
    {
      // It ends :)
    }
}

我应该采取什么措施?

【问题讨论】:

  • 我认为这种方法没有达到您的预期。例如,它会一直向北移动一步,然后向南移动一步(回到起点),然后再向北移动,以此类推,直到永远。你的意思是让它继续在每个方向上行走,并且只在那个方向上行走直到它到达极限,即Positions 包含一个“十字”形状?还是您的意思是让它在边界内的网格中找到所有位置?
  • 我看不出递归应该如何结束。似乎ifs 之一将始终为真,因此您不断地递归到该方法的深度,直到返回地址淹没您的堆栈。 end = false; 在这里完全没有意义,因为你从不检查它。
  • 这些不是if else 块是故意的吗?理论上,一次调用CreatePosition 可能会导致另外四次调用同一方法。
  • 我不清楚你希望你的输出实际上是什么be。你能提供一些示例输入和输出吗?

标签: c# .net wpf math coordinates


【解决方案1】:

回答您编辑的问题,您刚刚向北移动。

您需要将递归算法转换为迭代算法。这可能会变得相当复杂 - Eric Lippert 有一个关于不同技术的精彩博客系列(part 1part 2) - 但在你的情况下它很简单。

public void CreatePosition(decimal latitude, decimal longitude)
{
    Positions.Add(new Position(latitude, longitude))

    for (decimal currentLatitude = latitude + LatitudeDeviation;
         currentLatitude <= NorthLimit;
         currentLatitude += LatitudeDeviation)
    {
        Positions.Add(new Position(currentLatitude , longitude));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多