我正在为ASP.NET/C#网站编写一个算法,用于为学生,教师和课堂室计划一个时间表。我做这做递归这样的(伪代码):在递归中避免Stackoverflow的技巧
public Booking GetBooking(..., ref numberOfTries) {
numberOfTries--;
if (numberOfTries == 0) {
return null;
}
if (allResorcesAreAvailable) {
return new Booking()
}
// Try next time slot
return GetBooking(..., ref numberOfTries);
}
正如你可以看到我有一个确保递归从来没有失控(numberOfTries)的手柄。然而,随着时间的推移,该算法必然会尝试很多次,并导致Stackoverflow异常。有关如何避免这种情况的任何建议?增加堆栈大小(我不喜欢这个)?在线程中运行计划?我已经在考虑重写整个方法,但只是想看看是否有人可以提供一些建议。
递归是一个美丽而雄辩的想法,但我觉得如果难以管理。我会重写它,因为我是一个简单的女孩,我喜欢简单易维护的代码。我唯一看到错误的是numberOfTries可能没有向上约束的可能性。 – Missy
代码中没有什么使得递归有用。一个简单的循环可以取代这个。 –
这可能只是一个风格的建议,因为我不知道输入的范围,但如果你确实需要做递归,而不是有numberOfTries--在开始时你可以通过改变return语句来接近你的基本情况:如果输入为0,则返回GetBooking(...,ref numberOfTries-1)以避免堆栈溢出。但就像上面的评论所说的,从所显示的内容看,它们不需要递归。 –