1
如果我需要中途放棄遞歸子程序,我該怎麼辦?在中間中止遞歸子程序
引發異常並在遞歸子程序之外捕獲它。
將遞歸布爾參數Exit_Right_Now添加到遞歸子程序中,這會使其從遞歸的第N級向外遍歷到外部調用子程序。
停止使用顯式遞歸併重寫我的算法而不遞歸。
以上哪些變體是可行的,哪些不是?
請注意,我使用Ada編程語言編寫。由於Ada RM允許有關異常的一些優化,我不太確定異常是否會做正確的事情,而不是「取消」在異常引發之前的某些操作。阿達會做正確的事情嗎?
選項2工作得很好,雖然有一個體面的編譯器選項1應該更快,除了更容易。只有在堆棧空間可能成爲問題時,我纔會考慮選項3。 – 2014-08-28 19:28:28
關於你最後的問題,我不認爲優化會導致問題。 11.6中與異常有關的優化實際上只是涉及_language定義的checks_的權限,並不會影響你'raise'的異常。在遞歸子程序的每次調用中,需要最終確定的對象都將最終確定。如果您有任何關於優化效果的特定代碼,請將其作爲單獨問題發佈。 – ajb 2014-08-29 04:32:24
有一種情況,雖然引發異常可能沒有預期的效果:「out」參數,通常在子程序的退出時設置。因此,舉例來說,如果您將A作爲out參數,將其設置爲1,然後引發異常,則調用者可能實際上看不到實際參數中的值1。 – manuBriot 2014-08-29 08:01:46