如何直接跳出深層遞歸而不是一層一層跳出?
12-29
幾種方法:
1. 遞歸結束時 throw exception, 在頂層代碼 try catch2. 把遞歸函數放到一個獨立線程執行,在主線程做 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比賽中老是只能過一題或者兩題,該怎樣提高自己?