如何直接跳出深層遞歸而不是一層一層跳出?


幾種方法:

1. 遞歸結束時 throw exception, 在頂層代碼 try catch

2. 把遞歸函數放到一個獨立線程執行,在主線程做 condition wait,遞歸結束時notify下,然後直接退出線程。

3. setjmp + longjmp 本質上和異常差不多,只是用純C實現罷了

都是些奇技淫巧,一般用不到


這個得要一些奇技淫巧,在高級語言的層面,我覺得沒有一個通用的方法,並不推薦。

從原理上來說,函數調用的時候,返回地址是壓到棧里的,按照先進後出,要一層層取出來上層的返回地址。

exception也非常不推薦。


理論上來說可以,嵌入彙編么,最底層的時候,直接退棧到最高層,也就是直接操作sp指針。


寫個Monad吧,也不難。


限於C的話,可能得用sjlj,好大一個坑...


call/cc


如果能把深遞歸寫成函數的話,可以 return 出去

不過我覺得你可以考慮重新設計 iterator


你需要一個新線程來當背鍋俠。


如果了解函數調用的本質的話,你可以使用模擬棧來實現


longjmp


講道理的話

對於這種情境, goto最簡潔。

-------------------

遞歸。我才看清題目。

我想問的是,為啥有這種奇怪的需求。

應用場景能描述下嗎?


我覺得遇到這種情況意味著你不需要遞歸。


如果是用彙編語言,可以自己去平衡堆棧,add esp, value/add SP, value

如果是Windows下,可以用SEH鏈


所有遞歸演算法都可以改寫為非遞歸形式


這種遞歸一般都是尾遞歸。


exit();


#include 以後用極詭異的兩個標準庫函數:setjmp()和longjmp()。人家是非本地跳轉,比goto不知道高到哪裡去了。


setjmp longjmp 但是這種做法有風險 你每層遞歸設計的退出鉤子函數就執行不了了 再有就是涉及到signal處理的問題 可能也會比較頭疼


這是個矛盾的問題!

假設可以忽略各層遞歸的中間狀態!那麼使用遞歸的意義又何在直接用循環好了!

如果需要考慮遞歸的中間狀態!那麼為什麼要直接退到最外層?

實際工作中是要避免使用遞歸!因為遞歸都能拆成循環!遞歸效率太低!


exception


推薦閱讀:

獲得ACM ICPC Regional銀牌是一種什麼樣的體驗?
在acm比賽中擁有 1 or 2 個豬隊友是怎樣的體驗?
為什麼很多程序競賽題目都要求答案對 1e9+7 取模?
搞ACM一定要學習C++嗎?如果是,哪些知識是必要的(只功利地針對ACM,不指做工程項目)?
在ACM比賽中老是只能過一題或者兩題,該怎樣提高自己?

TAG:演算法 | 編程 | C編程語言 | ACM競賽 |