我正在爲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)以避免堆棧溢出。但就像上面的評論所說的,從所顯示的內容看,它們不需要遞歸。 –