2014-08-28 25 views
1

如果我需要中途放棄遞歸子程序,我該怎麼辦?在中間中止遞歸子程序

  1. 引發異常並在遞歸子程序之外捕獲它。

  2. 將遞歸布爾參數Exit_Right_Now添加到遞歸子程序中,這會使其從遞歸的第N級向外遍歷到外部調用子程序。

  3. 停止使用顯式遞歸併重寫我的算法而不遞歸。

以上哪些變體是可行的,哪些不是?

請注意,我使用Ada編程語言編寫。由於Ada RM允許有關異常的一些優化,我不太確定異常是否會做正確的事情,而不是「取消」在異常引發之前的某些操作。阿達會做正確的事情嗎?

+2

選項2工作得很好,雖然有一個體面的編譯器選項1應該更快,除了更容易。只有在堆棧空間可能成爲問題時,我纔會考慮選項3。 – 2014-08-28 19:28:28

+1

關於你最後的問題,我不認爲優化會導致問題。 11.6中與異常有關的優化實際上只是涉及_language定義的checks_的權限,並不會影響你'raise'的異常。在遞歸子程序的每次調用中,需要最終確定的對象都將最終確定。如果您有任何關於優化效果的特定代碼,請將其作爲單獨問題發佈。 – ajb 2014-08-29 04:32:24

+2

有一種情況,雖然引發異常可能沒有預期的效果:「out」參數,通常在子程序的退出時設置。因此,舉例來說,如果您將A作爲out參數,將其設置爲1,然後引發異常,則調用者可能實際上看不到實際參數中的值1。 – manuBriot 2014-08-29 08:01:46

回答

2

對Ada沒有任何具體的知識,顯然所有的方法都可能工作得很好;然而,3.可能會導致更難以理解的實現。爲了評估1和2,我可能會感興趣的是,執行是否中止的情況更多的是用例或錯誤情況。如果遞歸中的提前終止是「正常情況下預期的」執行流程,那麼可以將異常視爲濫用語言功能。