假設您在遞歸函數中有幾個級別。該函數最初是在main中調用的。有沒有辦法讓你擺脫遞歸,直接回到主體而不必通過上面的所有其他函數?在C++的最高級別退出遞歸函數
回答
您可能能夠從堆棧中獲取位置,並使用匯編器對其進行jmp操作,但您爲什麼想要?
此外,你必須考慮到,當你已經轉移到牧場時,新的人將不得不維護它。
你可以使用例外 - 或者拋出一些合適的異常或者製作你自己的並使用它。儘管通常不推薦使用流量控制的異常,但這是唯一可靠的方法。
在C中,你可以使用longjmp
/setjmp
這個,但我不認爲在C++中使用它是安全的(繞過析構函數?)。您可能必須使用例外。
'longjmp' /'setjmp'? __對C++非常不利。我假裝我沒有讀過。 – sbi 2010-05-11 08:09:50
@sbi:的確,因此我在回答中提出了*警告。可能仍然存在您可能想要使用它的具體情況,並且這樣做是安全的。簡單的遞歸函數不使用ctors/dtors,但通常應避免這種黑客行爲。 – 2010-05-11 08:14:44
問題是你如何到達那裏?什麼樣的算法將你深埋在遞歸中而沒有擺脫它的方式?
任何遞歸函數都必須有一種方法來結束遞歸,它只有在條件爲真或假時纔會遞歸。當它不成立時,遞歸結束,函數返回而不是遞歸更深。
爲什麼不以這種方式結束遞歸,通過所有級別返回?
如果你絕望,一個例外就是要走的路,但那是(正確的,IMO)皺起了眉頭。
退出遞歸不是問題,用正確的值出去就是了。不知何故,我的價值觀在退出的途中遭到破壞。 – neuromancer 2010-05-11 08:45:18
@Phenom:而不是分析和理解問題並修復它,你只是試圖躲避它?你怎麼知道它不是仍然潛伏在那裏,即使它在改變代碼之後可能不會立即發生? – sbi 2010-05-11 08:50:34
使您的功能,因此它的尾巴調用可優化。那麼沒有「功能以上」擔心。
不,你不能突破你的遞歸併直接返回到你的main()。如果你的遞歸函數在遞歸調用後沒有做其他工作,你將會有效地完成同樣的事情。我建議重構你的遞歸函數。描述你爲什麼想盡早從遞歸中解脫出來也是有幫助的。
我在nqueens回溯算法中遇到了同樣的問題。
最簡單的方法是添加一個全局布爾變量並使用它來阻止父函數中的任何進一步操作。
- 1. SQL服務器遞歸最高級別
- 2. F#遞歸函數退出?
- 3. 退出Elixir的遞歸函數
- 4. 高嵌套級別的Java遞歸
- 5. 如何退出遞歸函數?
- 6. 完全退出遞歸函數
- 7. 從遞歸函數退出while循環
- 8. SQL觸發器遞歸級別過高
- 9. 如何計算遞歸樹中的最高級別?
- 10. Python中遞歸的最大級別
- 11. BASH不同退出級別的多個退出函數
- 12. C++遞歸函數不會退出時的條件是滿足
- 13. php遞歸級別
- 14. 遞歸函數的高階函數?
- 15. Java中的高級遞歸
- 16. C++遞歸函數
- 17. 遞歸函數C++
- 18. 以遞歸方式查找C#中的最低級別項目
- 19. 遞歸在C++函數
- 20. 在遞歸函數[C]
- 21. 在C#中遞歸檢索數組中的最高數字?
- 22. 遞歸返回而不是退出(c#)
- 23. 匿名函數遞歸不返回指定的計數級別
- 24. Powershell遞歸函數 - 如何判斷我在哪個級別?
- 25. C中的遞歸函數#
- 26. 函數的遞歸C++
- 27. Javascript遞歸函數似乎在第一次通過後退出
- 28. 退出(0)在遞歸函數中做什麼?
- 29. 遞歸素數函數C++
- 30. 遞歸多級類別
遞歸函數應該返回*正常*。將遞歸轉換爲循環是解決*問題的一種方法*。順便說一句,爲什麼你想跳出遞歸?過早優化? – 2010-05-11 08:30:31
我遇到了一些問題,如果我可以直接存在main中,那麼這些問題很容易解決。但是,我追溯了遞歸併且已經解決了這個問題。 – neuromancer 2010-05-11 08:43:53